je/examples/collections/ship/sentity/Sample.java
2021-06-06 13:46:45 -04:00

239 lines
8.2 KiB
Java
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*-
* Copyright (C) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
*
* This file was distributed by Oracle as part of a version of Oracle Berkeley
* DB Java Edition made available at:
*
* http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
*
* Please see the LICENSE file included in the top-level directory of the
* appropriate version of Oracle Berkeley DB Java Edition for a copy of the
* license and additional information.
*/
package collections.ship.sentity;
import java.util.Iterator;
import java.util.Set;
import com.sleepycat.collections.TransactionRunner;
import com.sleepycat.collections.TransactionWorker;
import com.sleepycat.je.DatabaseException;
/**
* Sample is the main entry point for the sample program and may be run as
* follows:
*
* <pre>
* java collections.ship.sentity.Sample
* [-h <home-directory> ]
* </pre>
*
* <p> The default for the home directory is ./tmp -- the tmp subdirectory of
* the current directory where the sample is run. To specify a different home
* directory, use the -home option. The home directory must exist before
* running the sample. To recreate the sample database from scratch, delete
* all files in the home directory before running the sample. </p>
*
* @author Mark Hayes
*/
public class Sample {
private final SampleDatabase db;
private final SampleViews views;
/**
* Run the sample program.
*/
public static void main(String[] args) {
System.out.println("\nRunning sample: " + Sample.class);
// Parse the command line arguments.
//
String homeDir = "./tmp";
for (int i = 0; i < args.length; i += 1) {
if (args[i].equals("-h") && i < args.length - 1) {
i += 1;
homeDir = args[i];
} else {
System.err.println("Usage:\n java " + Sample.class.getName() +
"\n [-h <home-directory>]");
System.exit(2);
}
}
// Run the sample.
//
Sample sample = null;
try {
sample = new Sample(homeDir);
sample.run();
} catch (Exception e) {
// If an exception reaches this point, the last transaction did not
// complete. If the exception is RunRecoveryException, follow
// the Berkeley DB recovery procedures before running again.
e.printStackTrace();
} finally {
if (sample != null) {
try {
// Always attempt to close the database cleanly.
sample.close();
} catch (Exception e) {
System.err.println("Exception during database close:");
e.printStackTrace();
}
}
}
}
/**
* Open the database and views.
*/
private Sample(String homeDir)
throws DatabaseException {
db = new SampleDatabase(homeDir);
views = new SampleViews(db);
}
/**
* Close the database cleanly.
*/
private void close()
throws DatabaseException {
db.close();
}
/**
* Run two transactions to populate and print the database. A
* TransactionRunner is used to ensure consistent handling of transactions,
* including deadlock retries. But the best transaction handling mechanism
* to use depends on the application.
*/
private void run()
throws Exception {
TransactionRunner runner = new TransactionRunner(db.getEnvironment());
runner.run(new PopulateDatabase());
runner.run(new PrintDatabase());
}
/**
* Populate the database in a single transaction.
*/
private class PopulateDatabase implements TransactionWorker {
public void doWork() {
addSuppliers();
addParts();
addShipments();
}
}
/**
* Print the database in a single transaction. All entities are printed
* and the indices are used to print the entities for certain keys.
*
* <p> Note the use of special iterator() methods. These are used here
* with indices to find the shipments for certain keys.</p>
*/
private class PrintDatabase implements TransactionWorker {
public void doWork() {
printValues("Parts",
views.getPartSet().iterator());
printValues("Suppliers",
views.getSupplierSet().iterator());
printValues("Suppliers for City Paris",
views.getSupplierByCityMap().duplicates(
"Paris").iterator());
printValues("Shipments",
views.getShipmentSet().iterator());
printValues("Shipments for Part P1",
views.getShipmentByPartMap().duplicates(
new PartKey("P1")).iterator());
printValues("Shipments for Supplier S1",
views.getShipmentBySupplierMap().duplicates(
new SupplierKey("S1")).iterator());
}
}
/**
* Populate the part entities in the database. If the part set is not
* empty, assume that this has already been done.
*/
private void addParts() {
Set parts = views.getPartSet();
if (parts.isEmpty()) {
System.out.println("Adding Parts");
parts.add(new Part("P1", "Nut", "Red",
new Weight(12.0, Weight.GRAMS), "London"));
parts.add(new Part("P2", "Bolt", "Green",
new Weight(17.0, Weight.GRAMS), "Paris"));
parts.add(new Part("P3", "Screw", "Blue",
new Weight(17.0, Weight.GRAMS), "Rome"));
parts.add(new Part("P4", "Screw", "Red",
new Weight(14.0, Weight.GRAMS), "London"));
parts.add(new Part("P5", "Cam", "Blue",
new Weight(12.0, Weight.GRAMS), "Paris"));
parts.add(new Part("P6", "Cog", "Red",
new Weight(19.0, Weight.GRAMS), "London"));
}
}
/**
* Populate the supplier entities in the database. If the supplier set is
* not empty, assume that this has already been done.
*/
private void addSuppliers() {
Set suppliers = views.getSupplierSet();
if (suppliers.isEmpty()) {
System.out.println("Adding Suppliers");
suppliers.add(new Supplier("S1", "Smith", 20, "London"));
suppliers.add(new Supplier("S2", "Jones", 10, "Paris"));
suppliers.add(new Supplier("S3", "Blake", 30, "Paris"));
suppliers.add(new Supplier("S4", "Clark", 20, "London"));
suppliers.add(new Supplier("S5", "Adams", 30, "Athens"));
}
}
/**
* Populate the shipment entities in the database. If the shipment set
* is not empty, assume that this has already been done.
*/
private void addShipments() {
Set shipments = views.getShipmentSet();
if (shipments.isEmpty()) {
System.out.println("Adding Shipments");
shipments.add(new Shipment("P1", "S1", 300));
shipments.add(new Shipment("P2", "S1", 200));
shipments.add(new Shipment("P3", "S1", 400));
shipments.add(new Shipment("P4", "S1", 200));
shipments.add(new Shipment("P5", "S1", 100));
shipments.add(new Shipment("P6", "S1", 100));
shipments.add(new Shipment("P1", "S2", 300));
shipments.add(new Shipment("P2", "S2", 400));
shipments.add(new Shipment("P2", "S3", 200));
shipments.add(new Shipment("P2", "S4", 200));
shipments.add(new Shipment("P4", "S4", 300));
shipments.add(new Shipment("P5", "S4", 400));
}
}
/**
* Print the objects returned by an iterator of entity value objects.
*/
private void printValues(String label, Iterator iterator) {
System.out.println("\n--- " + label + " ---");
while (iterator.hasNext()) {
System.out.println(iterator.next().toString());
}
}
}