1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 2000,2008 Oracle.  All rights reserved.
5 *
6 * $Id: TupleSerialMarshalledBinding.java,v 12.8 2008/02/07 17:12:25 mark Exp $
7 */
8
9package com.sleepycat.bind.serial;
10
11import com.sleepycat.bind.tuple.MarshalledTupleKeyEntity;
12import com.sleepycat.bind.tuple.TupleInput;
13import com.sleepycat.bind.tuple.TupleOutput;
14
15/**
16 * A concrete <code>TupleSerialBinding</code> that delegates to the
17 * <code>MarshalledTupleKeyEntity</code> interface of the entity class.
18 *
19 * <p>The {@link MarshalledTupleKeyEntity} interface must be implemented by the
20 * entity class to convert between the key/data entry and entity object.</p>
21 *
22 * <p> The binding is "tricky" in that it uses the entity class for both the
23 * stored data entry and the combined entity object.  To do this, the entity's
24 * key field(s) are transient and are set by the binding after the data object
25 * has been deserialized. This avoids the use of a "data" class completely.
26 * </p>
27 *
28 * @author Mark Hayes
29 * @see MarshalledTupleKeyEntity
30 */
31public class TupleSerialMarshalledBinding extends TupleSerialBinding {
32
33    /**
34     * Creates a tuple-serial marshalled binding object.
35     *
36     * @param classCatalog is the catalog to hold shared class information and
37     * for a database should be a {@link StoredClassCatalog}.
38     *
39     * @param baseClass is the base class for serialized objects stored using
40     * this binding -- all objects using this binding must be an instance of
41     * this class.
42     */
43    public TupleSerialMarshalledBinding(ClassCatalog classCatalog,
44                                        Class baseClass) {
45
46        this(new SerialBinding(classCatalog, baseClass));
47    }
48
49    /**
50     * Creates a tuple-serial marshalled binding object.
51     *
52     * @param dataBinding is the binding used for serializing and deserializing
53     * the entity object.
54     */
55    public TupleSerialMarshalledBinding(SerialBinding dataBinding) {
56
57        super(dataBinding);
58    }
59
60    // javadoc is inherited
61    public Object entryToObject(TupleInput tupleInput, Object javaInput) {
62
63        /* Creates the entity by combining the stored key and data.
64         * This "tricky" binding returns the stored data as the entity, but
65         * first it sets the transient key fields from the stored key.
66         */
67        MarshalledTupleKeyEntity entity = (MarshalledTupleKeyEntity) javaInput;
68
69        if (tupleInput != null) { // may be null if not used by key extractor
70            entity.unmarshalPrimaryKey(tupleInput);
71        }
72        return entity;
73    }
74
75    // javadoc is inherited
76    public void objectToKey(Object object, TupleOutput output) {
77
78        /* Creates the stored key from the entity.
79         */
80        MarshalledTupleKeyEntity entity = (MarshalledTupleKeyEntity) object;
81        entity.marshalPrimaryKey(output);
82    }
83
84    // javadoc is inherited
85    public Object objectToData(Object object) {
86
87        /* Returns the entity as the stored data.  There is nothing to do here
88         * since the entity's key fields are transient.
89         */
90        return object;
91    }
92}
93