summaryrefslogtreecommitdiff
path: root/examples_java/src/collections/ship/basic
diff options
context:
space:
mode:
authorZhang Qiang <qiang.z.zhang@intel.com>2012-05-29 12:22:00 +0800
committerZhang Qiang <qiang.z.zhang@intel.com>2012-05-29 12:22:00 +0800
commit02f0634ac29e19c68279e5544cac963e7f1203b8 (patch)
treeb983472f94ef063cedf866d8ecfb55939171779d /examples_java/src/collections/ship/basic
parente776056ea09ba0b6d9505ced6913c9190a12d632 (diff)
downloaddb4-master.tar.gz
db4-master.tar.bz2
db4-master.zip
Sync source code from Tizen:BaseHEAD2.0_alphamaster2.0alpha1.0_post
Diffstat (limited to 'examples_java/src/collections/ship/basic')
-rw-r--r--examples_java/src/collections/ship/basic/PartData.java64
-rw-r--r--examples_java/src/collections/ship/basic/PartKey.java40
-rw-r--r--examples_java/src/collections/ship/basic/Sample.java254
-rw-r--r--examples_java/src/collections/ship/basic/SampleDatabase.java134
-rw-r--r--examples_java/src/collections/ship/basic/SampleViews.java122
-rw-r--r--examples_java/src/collections/ship/basic/ShipmentData.java41
-rw-r--r--examples_java/src/collections/ship/basic/ShipmentKey.java48
-rw-r--r--examples_java/src/collections/ship/basic/SupplierData.java57
-rw-r--r--examples_java/src/collections/ship/basic/SupplierKey.java40
-rw-r--r--examples_java/src/collections/ship/basic/Weight.java49
10 files changed, 849 insertions, 0 deletions
diff --git a/examples_java/src/collections/ship/basic/PartData.java b/examples_java/src/collections/ship/basic/PartData.java
new file mode 100644
index 0000000..316a56d
--- /dev/null
+++ b/examples_java/src/collections/ship/basic/PartData.java
@@ -0,0 +1,64 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2002-2009 Oracle. All rights reserved.
+ *
+ * $Id$
+ */
+
+package collections.ship.basic;
+
+import java.io.Serializable;
+
+/**
+ * A PartData serves as the data in the key/data pair for a part entity.
+ *
+ * <p> In this sample, PartData is used both as the storage entry for the
+ * data as well as the object binding to the data. Because it is used
+ * directly as storage data using serial format, it must be Serializable. </p>
+ *
+ * @author Mark Hayes
+ */
+public class PartData implements Serializable {
+
+ private String name;
+ private String color;
+ private Weight weight;
+ private String city;
+
+ public PartData(String name, String color, Weight weight, String city) {
+
+ this.name = name;
+ this.color = color;
+ this.weight = weight;
+ this.city = city;
+ }
+
+ public final String getName() {
+
+ return name;
+ }
+
+ public final String getColor() {
+
+ return color;
+ }
+
+ public final Weight getWeight() {
+
+ return weight;
+ }
+
+ public final String getCity() {
+
+ return city;
+ }
+
+ public String toString() {
+
+ return "[PartData: name=" + name +
+ " color=" + color +
+ " weight=" + weight +
+ " city=" + city + ']';
+ }
+}
diff --git a/examples_java/src/collections/ship/basic/PartKey.java b/examples_java/src/collections/ship/basic/PartKey.java
new file mode 100644
index 0000000..851362f
--- /dev/null
+++ b/examples_java/src/collections/ship/basic/PartKey.java
@@ -0,0 +1,40 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2002-2009 Oracle. All rights reserved.
+ *
+ * $Id$
+ */
+
+package collections.ship.basic;
+
+import java.io.Serializable;
+
+/**
+ * A PartKey serves as the key in the key/data pair for a part entity.
+ *
+ * <p> In this sample, PartKey is used both as the storage entry for the key as
+ * well as the object binding to the key. Because it is used directly as
+ * storage data using serial format, it must be Serializable. </p>
+ *
+ * @author Mark Hayes
+ */
+public class PartKey implements Serializable {
+
+ private String number;
+
+ public PartKey(String number) {
+
+ this.number = number;
+ }
+
+ public final String getNumber() {
+
+ return number;
+ }
+
+ public String toString() {
+
+ return "[PartKey: number=" + number + ']';
+ }
+}
diff --git a/examples_java/src/collections/ship/basic/Sample.java b/examples_java/src/collections/ship/basic/Sample.java
new file mode 100644
index 0000000..7413cf8
--- /dev/null
+++ b/examples_java/src/collections/ship/basic/Sample.java
@@ -0,0 +1,254 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2002-2009 Oracle. All rights reserved.
+ *
+ * $Id$
+ */
+
+package collections.ship.basic;
+
+import java.io.FileNotFoundException;
+import java.util.Iterator;
+import java.util.Map;
+
+import com.sleepycat.collections.TransactionRunner;
+import com.sleepycat.collections.TransactionWorker;
+import com.sleepycat.db.DatabaseException;
+
+/**
+ * Sample is the main entry point for the sample program and may be run as
+ * follows:
+ *
+ * <pre>
+ * java collections.ship.basic.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. 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 SampleDatabase db;
+ private 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, FileNotFoundException {
+
+ 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()
+ throws Exception {
+ addSuppliers();
+ addParts();
+ addShipments();
+ }
+ }
+
+ /**
+ * Print the database in a single transaction. All entities are printed.
+ */
+ private class PrintDatabase implements TransactionWorker {
+
+ public void doWork()
+ throws Exception {
+ printEntries("Parts",
+ views.getPartEntrySet().iterator());
+ printEntries("Suppliers",
+ views.getSupplierEntrySet().iterator());
+ printEntries("Shipments",
+ views.getShipmentEntrySet().iterator());
+ }
+ }
+
+ /**
+ * Populate the part entities in the database. If the part map is not
+ * empty, assume that this has already been done.
+ */
+ private void addParts() {
+
+ Map parts = views.getPartMap();
+ if (parts.isEmpty()) {
+ System.out.println("Adding Parts");
+ parts.put(new PartKey("P1"),
+ new PartData("Nut", "Red",
+ new Weight(12.0, Weight.GRAMS),
+ "London"));
+ parts.put(new PartKey("P2"),
+ new PartData("Bolt", "Green",
+ new Weight(17.0, Weight.GRAMS),
+ "Paris"));
+ parts.put(new PartKey("P3"),
+ new PartData("Screw", "Blue",
+ new Weight(17.0, Weight.GRAMS),
+ "Rome"));
+ parts.put(new PartKey("P4"),
+ new PartData("Screw", "Red",
+ new Weight(14.0, Weight.GRAMS),
+ "London"));
+ parts.put(new PartKey("P5"),
+ new PartData("Cam", "Blue",
+ new Weight(12.0, Weight.GRAMS),
+ "Paris"));
+ parts.put(new PartKey("P6"),
+ new PartData("Cog", "Red",
+ new Weight(19.0, Weight.GRAMS),
+ "London"));
+ }
+ }
+
+ /**
+ * Populate the supplier entities in the database. If the supplier map is
+ * not empty, assume that this has already been done.
+ */
+ private void addSuppliers() {
+
+ Map suppliers = views.getSupplierMap();
+ if (suppliers.isEmpty()) {
+ System.out.println("Adding Suppliers");
+ suppliers.put(new SupplierKey("S1"),
+ new SupplierData("Smith", 20, "London"));
+ suppliers.put(new SupplierKey("S2"),
+ new SupplierData("Jones", 10, "Paris"));
+ suppliers.put(new SupplierKey("S3"),
+ new SupplierData("Blake", 30, "Paris"));
+ suppliers.put(new SupplierKey("S4"),
+ new SupplierData("Clark", 20, "London"));
+ suppliers.put(new SupplierKey("S5"),
+ new SupplierData("Adams", 30, "Athens"));
+ }
+ }
+
+ /**
+ * Populate the shipment entities in the database. If the shipment map
+ * is not empty, assume that this has already been done.
+ */
+ private void addShipments() {
+
+ Map shipments = views.getShipmentMap();
+ if (shipments.isEmpty()) {
+ System.out.println("Adding Shipments");
+ shipments.put(new ShipmentKey("P1", "S1"),
+ new ShipmentData(300));
+ shipments.put(new ShipmentKey("P2", "S1"),
+ new ShipmentData(200));
+ shipments.put(new ShipmentKey("P3", "S1"),
+ new ShipmentData(400));
+ shipments.put(new ShipmentKey("P4", "S1"),
+ new ShipmentData(200));
+ shipments.put(new ShipmentKey("P5", "S1"),
+ new ShipmentData(100));
+ shipments.put(new ShipmentKey("P6", "S1"),
+ new ShipmentData(100));
+ shipments.put(new ShipmentKey("P1", "S2"),
+ new ShipmentData(300));
+ shipments.put(new ShipmentKey("P2", "S2"),
+ new ShipmentData(400));
+ shipments.put(new ShipmentKey("P2", "S3"),
+ new ShipmentData(200));
+ shipments.put(new ShipmentKey("P2", "S4"),
+ new ShipmentData(200));
+ shipments.put(new ShipmentKey("P4", "S4"),
+ new ShipmentData(300));
+ shipments.put(new ShipmentKey("P5", "S4"),
+ new ShipmentData(400));
+ }
+ }
+
+ /**
+ * Print the key/value objects returned by an iterator of Map.Entry
+ * objects.
+ */
+ private void printEntries(String label, Iterator iterator) {
+
+ System.out.println("\n--- " + label + " ---");
+ while (iterator.hasNext()) {
+ Map.Entry entry = (Map.Entry) iterator.next();
+ System.out.println(entry.getKey().toString());
+ System.out.println(entry.getValue().toString());
+ }
+ }
+}
diff --git a/examples_java/src/collections/ship/basic/SampleDatabase.java b/examples_java/src/collections/ship/basic/SampleDatabase.java
new file mode 100644
index 0000000..47fff2c
--- /dev/null
+++ b/examples_java/src/collections/ship/basic/SampleDatabase.java
@@ -0,0 +1,134 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2002-2009 Oracle. All rights reserved.
+ *
+ * $Id$
+ */
+
+package collections.ship.basic;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+import com.sleepycat.bind.serial.StoredClassCatalog;
+import com.sleepycat.db.Database;
+import com.sleepycat.db.DatabaseConfig;
+import com.sleepycat.db.DatabaseException;
+import com.sleepycat.db.DatabaseType;
+import com.sleepycat.db.Environment;
+import com.sleepycat.db.EnvironmentConfig;
+
+/**
+ * SampleDatabase defines the storage containers, indices and foreign keys
+ * for the sample database.
+ *
+ * @author Mark Hayes
+ */
+public class SampleDatabase {
+
+ private static final String CLASS_CATALOG = "java_class_catalog";
+ private static final String SUPPLIER_STORE = "supplier_store";
+ private static final String PART_STORE = "part_store";
+ private static final String SHIPMENT_STORE = "shipment_store";
+
+ private Environment env;
+ private Database partDb;
+ private Database supplierDb;
+ private Database shipmentDb;
+ private StoredClassCatalog javaCatalog;
+
+ /**
+ * Open all storage containers, indices, and catalogs.
+ */
+ public SampleDatabase(String homeDirectory)
+ throws DatabaseException, FileNotFoundException {
+
+ // Open the Berkeley DB environment in transactional mode.
+ //
+ System.out.println("Opening environment in: " + homeDirectory);
+ EnvironmentConfig envConfig = new EnvironmentConfig();
+ envConfig.setTransactional(true);
+ envConfig.setAllowCreate(true);
+ envConfig.setInitializeCache(true);
+ envConfig.setInitializeLocking(true);
+ env = new Environment(new File(homeDirectory), envConfig);
+
+ // Set the Berkeley DB config for opening all stores.
+ //
+ DatabaseConfig dbConfig = new DatabaseConfig();
+ dbConfig.setTransactional(true);
+ dbConfig.setAllowCreate(true);
+ dbConfig.setType(DatabaseType.BTREE);
+
+ // Create the Serial class catalog. This holds the serialized class
+ // format for all database records of serial format.
+ //
+ Database catalogDb = env.openDatabase(null, CLASS_CATALOG, null,
+ dbConfig);
+ javaCatalog = new StoredClassCatalog(catalogDb);
+
+ // Open the Berkeley DB database for the part, supplier and shipment
+ // stores. The stores are opened with no duplicate keys allowed.
+ //
+ partDb = env.openDatabase(null, PART_STORE, null, dbConfig);
+
+ supplierDb = env.openDatabase(null, SUPPLIER_STORE, null, dbConfig);
+
+ shipmentDb = env.openDatabase(null, SHIPMENT_STORE, null, dbConfig);
+ }
+
+ /**
+ * Return the storage environment for the database.
+ */
+ public final Environment getEnvironment() {
+
+ return env;
+ }
+
+ /**
+ * Return the class catalog.
+ */
+ public final StoredClassCatalog getClassCatalog() {
+
+ return javaCatalog;
+ }
+
+ /**
+ * Return the part storage container.
+ */
+ public final Database getPartDatabase() {
+
+ return partDb;
+ }
+
+ /**
+ * Return the supplier storage container.
+ */
+ public final Database getSupplierDatabase() {
+
+ return supplierDb;
+ }
+
+ /**
+ * Return the shipment storage container.
+ */
+ public final Database getShipmentDatabase() {
+
+ return shipmentDb;
+ }
+
+ /**
+ * Close all databases and the environment.
+ */
+ public void close()
+ throws DatabaseException {
+
+ partDb.close();
+ supplierDb.close();
+ shipmentDb.close();
+ // And don't forget to close the catalog and the environment.
+ javaCatalog.close();
+ env.close();
+ }
+}
diff --git a/examples_java/src/collections/ship/basic/SampleViews.java b/examples_java/src/collections/ship/basic/SampleViews.java
new file mode 100644
index 0000000..97c1192
--- /dev/null
+++ b/examples_java/src/collections/ship/basic/SampleViews.java
@@ -0,0 +1,122 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2002-2009 Oracle. All rights reserved.
+ *
+ * $Id$
+ */
+
+package collections.ship.basic;
+
+import com.sleepycat.bind.EntryBinding;
+import com.sleepycat.bind.serial.ClassCatalog;
+import com.sleepycat.bind.serial.SerialBinding;
+import com.sleepycat.collections.StoredEntrySet;
+import com.sleepycat.collections.StoredMap;
+
+/**
+ * SampleViews defines the data bindings and collection views for the sample
+ * database.
+ *
+ * @author Mark Hayes
+ */
+public class SampleViews {
+
+ private StoredMap partMap;
+ private StoredMap supplierMap;
+ private StoredMap shipmentMap;
+
+ /**
+ * Create the data bindings and collection views.
+ */
+ public SampleViews(SampleDatabase db) {
+
+ // In this sample, the stored key and data entries are used directly
+ // rather than mapping them to separate objects. Therefore, no binding
+ // classes are defined here and the SerialBinding class is used.
+ //
+ ClassCatalog catalog = db.getClassCatalog();
+ EntryBinding partKeyBinding =
+ new SerialBinding(catalog, PartKey.class);
+ EntryBinding partDataBinding =
+ new SerialBinding(catalog, PartData.class);
+ EntryBinding supplierKeyBinding =
+ new SerialBinding(catalog, SupplierKey.class);
+ EntryBinding supplierDataBinding =
+ new SerialBinding(catalog, SupplierData.class);
+ EntryBinding shipmentKeyBinding =
+ new SerialBinding(catalog, ShipmentKey.class);
+ EntryBinding shipmentDataBinding =
+ new SerialBinding(catalog, ShipmentData.class);
+
+ // Create map views for all stores and indices.
+ // StoredSortedMap is not used since the stores and indices are
+ // ordered by serialized key objects, which do not provide a very
+ // useful ordering.
+ //
+ partMap =
+ new StoredMap(db.getPartDatabase(),
+ partKeyBinding, partDataBinding, true);
+ supplierMap =
+ new StoredMap(db.getSupplierDatabase(),
+ supplierKeyBinding, supplierDataBinding, true);
+ shipmentMap =
+ new StoredMap(db.getShipmentDatabase(),
+ shipmentKeyBinding, shipmentDataBinding, true);
+ }
+
+ // The views returned below can be accessed using the java.util.Map or
+ // java.util.Set interfaces, or using the StoredMap and StoredEntrySet
+ // classes, which provide additional methods. The entry sets could be
+ // obtained directly from the Map.entrySet() method, but convenience
+ // methods are provided here to return them in order to avoid down-casting
+ // elsewhere.
+
+ /**
+ * Return a map view of the part storage container.
+ */
+ public final StoredMap getPartMap() {
+
+ return partMap;
+ }
+
+ /**
+ * Return a map view of the supplier storage container.
+ */
+ public final StoredMap getSupplierMap() {
+
+ return supplierMap;
+ }
+
+ /**
+ * Return a map view of the shipment storage container.
+ */
+ public final StoredMap getShipmentMap() {
+
+ return shipmentMap;
+ }
+
+ /**
+ * Return an entry set view of the part storage container.
+ */
+ public final StoredEntrySet getPartEntrySet() {
+
+ return (StoredEntrySet) partMap.entrySet();
+ }
+
+ /**
+ * Return an entry set view of the supplier storage container.
+ */
+ public final StoredEntrySet getSupplierEntrySet() {
+
+ return (StoredEntrySet) supplierMap.entrySet();
+ }
+
+ /**
+ * Return an entry set view of the shipment storage container.
+ */
+ public final StoredEntrySet getShipmentEntrySet() {
+
+ return (StoredEntrySet) shipmentMap.entrySet();
+ }
+}
diff --git a/examples_java/src/collections/ship/basic/ShipmentData.java b/examples_java/src/collections/ship/basic/ShipmentData.java
new file mode 100644
index 0000000..96f3336
--- /dev/null
+++ b/examples_java/src/collections/ship/basic/ShipmentData.java
@@ -0,0 +1,41 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2002-2009 Oracle. All rights reserved.
+ *
+ * $Id$
+ */
+
+package collections.ship.basic;
+
+import java.io.Serializable;
+
+/**
+ * A ShipmentData serves as the data in the key/data pair for a shipment
+ * entity.
+ *
+ * <p> In this sample, ShipmentData is used both as the storage entry for the
+ * data as well as the object binding to the data. Because it is used
+ * directly as storage data using serial format, it must be Serializable. </p>
+ *
+ * @author Mark Hayes
+ */
+public class ShipmentData implements Serializable {
+
+ private int quantity;
+
+ public ShipmentData(int quantity) {
+
+ this.quantity = quantity;
+ }
+
+ public final int getQuantity() {
+
+ return quantity;
+ }
+
+ public String toString() {
+
+ return "[ShipmentData: quantity=" + quantity + ']';
+ }
+}
diff --git a/examples_java/src/collections/ship/basic/ShipmentKey.java b/examples_java/src/collections/ship/basic/ShipmentKey.java
new file mode 100644
index 0000000..2dab3dc
--- /dev/null
+++ b/examples_java/src/collections/ship/basic/ShipmentKey.java
@@ -0,0 +1,48 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2002-2009 Oracle. All rights reserved.
+ *
+ * $Id$
+ */
+
+package collections.ship.basic;
+
+import java.io.Serializable;
+
+/**
+ * A ShipmentKey serves as the key in the key/data pair for a shipment entity.
+ *
+ * <p> In this sample, ShipmentKey is used both as the storage entry for the
+ * key as well as the object binding to the key. Because it is used directly
+ * as storage data using serial format, it must be Serializable. </p>
+ *
+ * @author Mark Hayes
+ */
+public class ShipmentKey implements Serializable {
+
+ private String partNumber;
+ private String supplierNumber;
+
+ public ShipmentKey(String partNumber, String supplierNumber) {
+
+ this.partNumber = partNumber;
+ this.supplierNumber = supplierNumber;
+ }
+
+ public final String getPartNumber() {
+
+ return partNumber;
+ }
+
+ public final String getSupplierNumber() {
+
+ return supplierNumber;
+ }
+
+ public String toString() {
+
+ return "[ShipmentKey: supplier=" + supplierNumber +
+ " part=" + partNumber + ']';
+ }
+}
diff --git a/examples_java/src/collections/ship/basic/SupplierData.java b/examples_java/src/collections/ship/basic/SupplierData.java
new file mode 100644
index 0000000..0853f23
--- /dev/null
+++ b/examples_java/src/collections/ship/basic/SupplierData.java
@@ -0,0 +1,57 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2002-2009 Oracle. All rights reserved.
+ *
+ * $Id$
+ */
+
+package collections.ship.basic;
+
+import java.io.Serializable;
+
+/**
+ * A SupplierData serves as the data in the key/data pair for a supplier
+ * entity.
+ *
+ * <p> In this sample, SupplierData is used both as the storage entry for the
+ * data as well as the object binding to the data. Because it is used
+ * directly as storage data using serial format, it must be Serializable. </p>
+ *
+ * @author Mark Hayes
+ */
+public class SupplierData implements Serializable {
+
+ private String name;
+ private int status;
+ private String city;
+
+ public SupplierData(String name, int status, String city) {
+
+ this.name = name;
+ this.status = status;
+ this.city = city;
+ }
+
+ public final String getName() {
+
+ return name;
+ }
+
+ public final int getStatus() {
+
+ return status;
+ }
+
+ public final String getCity() {
+
+ return city;
+ }
+
+ public String toString() {
+
+ return "[SupplierData: name=" + name +
+ " status=" + status +
+ " city=" + city + ']';
+ }
+}
diff --git a/examples_java/src/collections/ship/basic/SupplierKey.java b/examples_java/src/collections/ship/basic/SupplierKey.java
new file mode 100644
index 0000000..6f16a1b
--- /dev/null
+++ b/examples_java/src/collections/ship/basic/SupplierKey.java
@@ -0,0 +1,40 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2002-2009 Oracle. All rights reserved.
+ *
+ * $Id$
+ */
+
+package collections.ship.basic;
+
+import java.io.Serializable;
+
+/**
+ * A SupplierKey serves as the key in the key/data pair for a supplier entity.
+ *
+ * <p>In this sample, SupplierKey is used both as the storage entry for the key
+ * as well as the object binding to the key. Because it is used directly as
+ * storage data using serial format, it must be Serializable. </p>
+ *
+ * @author Mark Hayes
+ */
+public class SupplierKey implements Serializable {
+
+ private String number;
+
+ public SupplierKey(String number) {
+
+ this.number = number;
+ }
+
+ public final String getNumber() {
+
+ return number;
+ }
+
+ public String toString() {
+
+ return "[SupplierKey: number=" + number + ']';
+ }
+}
diff --git a/examples_java/src/collections/ship/basic/Weight.java b/examples_java/src/collections/ship/basic/Weight.java
new file mode 100644
index 0000000..f5303fa
--- /dev/null
+++ b/examples_java/src/collections/ship/basic/Weight.java
@@ -0,0 +1,49 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2002-2009 Oracle. All rights reserved.
+ *
+ * $Id$
+ */
+
+package collections.ship.basic;
+
+import java.io.Serializable;
+
+/**
+ * Weight represents a weight amount and unit of measure.
+ *
+ * <p> In this sample, Weight is embedded in part data values which are stored
+ * as Serial serialized objects; therefore Weight must be Serializable. </p>
+ *
+ * @author Mark Hayes
+ */
+public class Weight implements Serializable {
+
+ public final static String GRAMS = "grams";
+ public final static String OUNCES = "ounces";
+
+ private double amount;
+ private String units;
+
+ public Weight(double amount, String units) {
+
+ this.amount = amount;
+ this.units = units;
+ }
+
+ public final double getAmount() {
+
+ return amount;
+ }
+
+ public final String getUnits() {
+
+ return units;
+ }
+
+ public String toString() {
+
+ return "[" + amount + ' ' + units + ']';
+ }
+}