1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 2002,2008 Oracle.  All rights reserved.
5 *
6 * $Id: Shipment.java,v 12.7 2008/01/08 20:58:30 bostic Exp $
7 */
8
9package collections.ship.marshal;
10
11import java.io.Serializable;
12
13import com.sleepycat.bind.tuple.TupleInput;
14import com.sleepycat.bind.tuple.TupleOutput;
15
16/**
17 * A Shipment represents the combined key/data pair for a shipment entity.
18 *
19 * <p> In this sample, Shipment is bound to the stored key/data entry by
20 * implementing the MarshalledEnt interface, which is called by {@link
21 * SampleViews.MarshalledEntityBinding}. </p>
22 *
23 * <p> The binding is "tricky" in that it uses this class for both the stored
24 * data entry and the combined entity object.  To do this, the key field(s) are
25 * transient and are set by the binding after the data object has been
26 * deserialized. This avoids the use of a ShipmentData class completely. </p>
27 *
28 * <p> Since this class is used directly for data storage, it must be
29 * Serializable. </p>
30 *
31 * @author Mark Hayes
32 */
33public class Shipment implements Serializable, MarshalledEnt {
34
35    static final String PART_KEY = "part";
36    static final String SUPPLIER_KEY = "supplier";
37
38    private transient String partNumber;
39    private transient String supplierNumber;
40    private int quantity;
41
42    public Shipment(String partNumber, String supplierNumber, int quantity) {
43
44        this.partNumber = partNumber;
45        this.supplierNumber = supplierNumber;
46        this.quantity = quantity;
47    }
48
49    /**
50     * Set the transient key fields after deserializing.  This method is only
51     * called by data bindings.
52     */
53    void setKey(String partNumber, String supplierNumber) {
54
55        this.partNumber = partNumber;
56        this.supplierNumber = supplierNumber;
57    }
58
59    public final String getPartNumber() {
60
61        return partNumber;
62    }
63
64    public final String getSupplierNumber() {
65
66        return supplierNumber;
67    }
68
69    public final int getQuantity() {
70
71        return quantity;
72    }
73
74    public String toString() {
75
76        return "[Shipment: part=" + partNumber +
77                " supplier=" + supplierNumber +
78                " quantity=" + quantity + ']';
79    }
80
81    // --- MarshalledEnt implementation ---
82
83    Shipment() {
84
85        // A no-argument constructor is necessary only to allow the binding to
86        // instantiate objects of this class.
87    }
88
89    public void unmarshalPrimaryKey(TupleInput keyInput) {
90
91        this.partNumber = keyInput.readString();
92        this.supplierNumber = keyInput.readString();
93    }
94
95    public void marshalPrimaryKey(TupleOutput keyOutput) {
96
97        keyOutput.writeString(this.partNumber);
98        keyOutput.writeString(this.supplierNumber);
99    }
100
101    public boolean marshalSecondaryKey(String keyName, TupleOutput keyOutput) {
102
103        if (keyName.equals(PART_KEY)) {
104            keyOutput.writeString(this.partNumber);
105            return true;
106        } else if (keyName.equals(SUPPLIER_KEY)) {
107            keyOutput.writeString(this.supplierNumber);
108            return true;
109        } else {
110            throw new UnsupportedOperationException(keyName);
111        }
112    }
113}
114