/*- * See the file LICENSE for redistribution information. * * Copyright (c) 2000, 2010 Oracle and/or its affiliates. All rights reserved. * */ package com.sleepycat.collections; import com.sleepycat.bind.EntryBinding; import com.sleepycat.bind.serial.ClassCatalog; import com.sleepycat.bind.serial.TupleSerialMarshalledBinding; import com.sleepycat.bind.serial.TupleSerialMarshalledKeyCreator; import com.sleepycat.bind.tuple.MarshalledTupleEntry; // for javadoc import com.sleepycat.bind.tuple.MarshalledTupleKeyEntity; import com.sleepycat.bind.tuple.TupleBinding; import com.sleepycat.bind.tuple.TupleMarshalledBinding; import com.sleepycat.db.Database; /** * Creates stored collections having tuple keys and serialized entity values. * The entity classes must be Serializable and must implement the * MarshalledTupleKeyEntity interfaces. The key classes must either implement * the MarshalledTupleEntry interface or be one of the Java primitive type * classes. Underlying binding objects are created automatically. * * @author Mark Hayes */ public class TupleSerialFactory { private ClassCatalog catalog; /** * Creates a tuple-serial factory for given environment and class catalog. */ public TupleSerialFactory(ClassCatalog catalog) { this.catalog = catalog; } /** * Returns the class catalog associated with this factory. */ public final ClassCatalog getCatalog() { return catalog; } /** * Creates a map from a previously opened Database object. * * @param db the previously opened Database object. * * @param keyClass is the class used for map keys. It must implement the * {@link MarshalledTupleEntry} interface or be one of the Java primitive * type classes. * * @param valueBaseClass the base class of the entity values for this * store. It must implement the {@link MarshalledTupleKeyEntity} * interface. * * @param writeAllowed is true to create a read-write collection or false * to create a read-only collection. */ public StoredMap newMap(Database db, Class keyClass, Class valueBaseClass, boolean writeAllowed) { return new StoredMap(db, getKeyBinding(keyClass), getEntityBinding(valueBaseClass), writeAllowed); } /** * Creates a sorted map from a previously opened Database object. * * @param db the previously opened Database object. * * @param keyClass is the class used for map keys. It must implement the * {@link MarshalledTupleEntry} interface or be one of the Java primitive * type classes. * * @param valueBaseClass the base class of the entity values for this * store. It must implement the {@link MarshalledTupleKeyEntity} * interface. * * @param writeAllowed is true to create a read-write collection or false * to create a read-only collection. */ public StoredSortedMap newSortedMap(Database db, Class keyClass, Class valueBaseClass, boolean writeAllowed) { return new StoredSortedMap(db, getKeyBinding(keyClass), getEntityBinding(valueBaseClass), writeAllowed); } /** * Creates a SecondaryKeyCreator object for use in configuring * a SecondaryDatabase. The returned object implements * the {@link com.sleepycat.db.SecondaryKeyCreator} interface. * * @param valueBaseClass the base class of the entity values for this * store. It must implement the {@link MarshalledTupleKeyEntity} * interface. * * @param keyName is the key name passed to the {@link * MarshalledTupleKeyEntity#marshalSecondaryKey} method to identify the * secondary key. */ public TupleSerialMarshalledKeyCreator getKeyCreator(Class valueBaseClass, String keyName) { return new TupleSerialMarshalledKeyCreator (getEntityBinding(valueBaseClass), keyName); } public TupleSerialMarshalledBinding getEntityBinding(Class baseClass) { return new TupleSerialMarshalledBinding(catalog, baseClass); } private EntryBinding getKeyBinding(Class keyClass) { EntryBinding binding = TupleBinding.getPrimitiveBinding(keyClass); if (binding == null) { /* * Cannot use type param here because it does not implement * MarshalledTupleEntry if it is a primitive class. */ binding = new TupleMarshalledBinding(keyClass); } return binding; } }