1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 2002,2008 Oracle.  All rights reserved.
5 *
6 * $Id: SampleViews.java,v 12.7 2008/01/08 20:58:29 bostic Exp $
7 */
8
9package collections.ship.entity;
10
11import com.sleepycat.bind.EntityBinding;
12import com.sleepycat.bind.serial.ClassCatalog;
13import com.sleepycat.bind.serial.SerialBinding;
14import com.sleepycat.bind.serial.SerialSerialBinding;
15import com.sleepycat.collections.StoredSortedMap;
16import com.sleepycat.collections.StoredValueSet;
17
18/**
19 * SampleViews defines the data bindings and collection views for the sample
20 * database.
21 *
22 * @author Mark Hayes
23 */
24public class SampleViews {
25
26    private StoredSortedMap partMap;
27    private StoredSortedMap supplierMap;
28    private StoredSortedMap shipmentMap;
29    private StoredSortedMap shipmentByPartMap;
30    private StoredSortedMap shipmentBySupplierMap;
31    private StoredSortedMap supplierByCityMap;
32
33    /**
34     * Create the data bindings and collection views.
35     */
36    public SampleViews(SampleDatabase db) {
37
38        // Create the data bindings.
39        // In this sample, EntityBinding classes are used to bind the stored
40        // key/data entry pair to a combined data object.  For keys, however,
41        // the stored entry is used directly via a SerialBinding and no
42        // special binding class is needed.
43        //
44        ClassCatalog catalog = db.getClassCatalog();
45        SerialBinding partKeyBinding =
46            new SerialBinding(catalog, PartKey.class);
47        EntityBinding partDataBinding =
48            new PartBinding(catalog, PartKey.class, PartData.class);
49        SerialBinding supplierKeyBinding =
50            new SerialBinding(catalog, SupplierKey.class);
51        EntityBinding supplierDataBinding =
52            new SupplierBinding(catalog, SupplierKey.class,
53                                SupplierData.class);
54        SerialBinding shipmentKeyBinding =
55            new SerialBinding(catalog, ShipmentKey.class);
56        EntityBinding shipmentDataBinding =
57            new ShipmentBinding(catalog, ShipmentKey.class,
58                                ShipmentData.class);
59        SerialBinding cityKeyBinding =
60            new SerialBinding(catalog, String.class);
61
62        // Create map views for all stores and indices.
63        // StoredSortedMap is not used since the stores and indices are
64        // ordered by serialized key objects, which do not provide a very
65        // useful ordering.
66        //
67        partMap =
68            new StoredSortedMap(db.getPartDatabase(),
69                                partKeyBinding, partDataBinding, true);
70        supplierMap =
71            new StoredSortedMap(db.getSupplierDatabase(),
72                                supplierKeyBinding, supplierDataBinding, true);
73        shipmentMap =
74            new StoredSortedMap(db.getShipmentDatabase(),
75                                shipmentKeyBinding, shipmentDataBinding, true);
76        shipmentByPartMap =
77            new StoredSortedMap(db.getShipmentByPartDatabase(),
78                                partKeyBinding, shipmentDataBinding, true);
79        shipmentBySupplierMap =
80            new StoredSortedMap(db.getShipmentBySupplierDatabase(),
81                                supplierKeyBinding, shipmentDataBinding, true);
82        supplierByCityMap =
83            new StoredSortedMap(db.getSupplierByCityDatabase(),
84                                cityKeyBinding, supplierDataBinding, true);
85    }
86
87    // The views returned below can be accessed using the java.util.Map or
88    // java.util.Set interfaces, or using the StoredSortedMap and
89    // StoredValueSet classes, which provide additional methods.  The entity
90    // sets could be obtained directly from the Map.values() method but
91    // convenience methods are provided here to return them in order to avoid
92    // down-casting elsewhere.
93
94    /**
95     * Return a map view of the part storage container.
96     */
97    public StoredSortedMap getPartMap() {
98
99        return partMap;
100    }
101
102    /**
103     * Return a map view of the supplier storage container.
104     */
105    public StoredSortedMap getSupplierMap() {
106
107        return supplierMap;
108    }
109
110    /**
111     * Return a map view of the shipment storage container.
112     */
113    public StoredSortedMap getShipmentMap() {
114
115        return shipmentMap;
116    }
117
118    /**
119     * Return an entity set view of the part storage container.
120     */
121    public StoredValueSet getPartSet() {
122
123        return (StoredValueSet) partMap.values();
124    }
125
126    /**
127     * Return an entity set view of the supplier storage container.
128     */
129    public StoredValueSet getSupplierSet() {
130
131        return (StoredValueSet) supplierMap.values();
132    }
133
134    /**
135     * Return an entity set view of the shipment storage container.
136     */
137    public StoredValueSet getShipmentSet() {
138
139        return (StoredValueSet) shipmentMap.values();
140    }
141
142    /**
143     * Return a map view of the shipment-by-part index.
144     */
145    public StoredSortedMap getShipmentByPartMap() {
146
147        return shipmentByPartMap;
148    }
149
150    /**
151     * Return a map view of the shipment-by-supplier index.
152     */
153    public StoredSortedMap getShipmentBySupplierMap() {
154
155        return shipmentBySupplierMap;
156    }
157
158    /**
159     * Return a map view of the supplier-by-city index.
160     */
161    public final StoredSortedMap getSupplierByCityMap() {
162
163        return supplierByCityMap;
164    }
165
166    /**
167     * PartBinding is used to bind the stored key/data entry pair for a part
168     * to a combined data object (entity).
169     */
170    private static class PartBinding extends SerialSerialBinding {
171
172        /**
173         * Construct the binding object.
174         */
175        private PartBinding(ClassCatalog classCatalog,
176                            Class keyClass,
177                            Class dataClass) {
178
179            super(classCatalog, keyClass, dataClass);
180        }
181
182        /**
183         * Create the entity by combining the stored key and data.
184         */
185        public Object entryToObject(Object keyInput, Object dataInput) {
186
187            PartKey key = (PartKey) keyInput;
188            PartData data = (PartData) dataInput;
189            return new Part(key.getNumber(), data.getName(), data.getColor(),
190                            data.getWeight(), data.getCity());
191        }
192
193        /**
194         * Create the stored key from the entity.
195         */
196        public Object objectToKey(Object object) {
197
198            Part part = (Part) object;
199            return new PartKey(part.getNumber());
200        }
201
202        /**
203         * Create the stored data from the entity.
204         */
205        public Object objectToData(Object object) {
206
207            Part part = (Part) object;
208            return new PartData(part.getName(), part.getColor(),
209                                 part.getWeight(), part.getCity());
210        }
211    }
212
213    /**
214     * SupplierBinding is used to bind the stored key/data entry pair for a
215     * supplier to a combined data object (entity).
216     */
217    private static class SupplierBinding extends SerialSerialBinding {
218
219        /**
220         * Construct the binding object.
221         */
222        private SupplierBinding(ClassCatalog classCatalog,
223                                Class keyClass,
224                                Class dataClass) {
225
226            super(classCatalog, keyClass, dataClass);
227        }
228
229        /**
230         * Create the entity by combining the stored key and data.
231         */
232        public Object entryToObject(Object keyInput, Object dataInput) {
233
234            SupplierKey key = (SupplierKey) keyInput;
235            SupplierData data = (SupplierData) dataInput;
236            return new Supplier(key.getNumber(), data.getName(),
237                                data.getStatus(), data.getCity());
238        }
239
240        /**
241         * Create the stored key from the entity.
242         */
243        public Object objectToKey(Object object) {
244
245            Supplier supplier = (Supplier) object;
246            return new SupplierKey(supplier.getNumber());
247        }
248
249        /**
250         * Create the stored data from the entity.
251         */
252        public Object objectToData(Object object) {
253
254            Supplier supplier = (Supplier) object;
255            return new SupplierData(supplier.getName(), supplier.getStatus(),
256                                     supplier.getCity());
257        }
258    }
259
260    /**
261     * ShipmentBinding is used to bind the stored key/data entry pair for a
262     * shipment to a combined data object (entity).
263     */
264    private static class ShipmentBinding extends SerialSerialBinding {
265
266        /**
267         * Construct the binding object.
268         */
269        private ShipmentBinding(ClassCatalog classCatalog,
270                                Class keyClass,
271                                Class dataClass) {
272
273            super(classCatalog, keyClass, dataClass);
274        }
275
276        /**
277         * Create the entity by combining the stored key and data.
278         */
279        public Object entryToObject(Object keyInput, Object dataInput) {
280
281            ShipmentKey key = (ShipmentKey) keyInput;
282            ShipmentData data = (ShipmentData) dataInput;
283            return new Shipment(key.getPartNumber(), key.getSupplierNumber(),
284                                data.getQuantity());
285        }
286
287        /**
288         * Create the stored key from the entity.
289         */
290        public Object objectToKey(Object object) {
291
292            Shipment shipment = (Shipment) object;
293            return new ShipmentKey(shipment.getPartNumber(),
294                                   shipment.getSupplierNumber());
295        }
296
297        /**
298         * Create the stored data from the entity.
299         */
300        public Object objectToData(Object object) {
301
302            Shipment shipment = (Shipment) object;
303            return new ShipmentData(shipment.getQuantity());
304        }
305    }
306}
307