blob: 0c52d221f3ec9baa477aef772bba1cfa9b36e5cd [file] [log] [blame]
/*-
* Copyright (C) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
*
* This file was distributed by Oracle as part of a version of Oracle Berkeley
* DB Java Edition made available at:
*
* http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
*
* Please see the LICENSE file included in the top-level directory of the
* appropriate version of Oracle Berkeley DB Java Edition for a copy of the
* license and additional information.
*/
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.je.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.
*
* @param catalog the ClassCatalog.
*/
public TupleSerialFactory(ClassCatalog catalog) {
this.catalog = catalog;
}
/**
* Returns the class catalog associated with this factory.
*
* @return the catalog.
*/
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.
*
* @param <K> the key class.
*
* @param <V> the value base class.
*
* @return the map.
*/
public <K, V extends MarshalledTupleKeyEntity> StoredMap<K, V>
newMap(Database db,
Class<K> keyClass,
Class<V> valueBaseClass,
boolean writeAllowed) {
return new StoredMap<K, V>(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.
*
* @param <K> the key class.
*
* @param <V> the value base class.
*
* @return the sorted map.
*/
public <K, V extends MarshalledTupleKeyEntity> StoredSortedMap<K, V>
newSortedMap(Database db,
Class<K> keyClass,
Class<V> valueBaseClass,
boolean writeAllowed) {
return new StoredSortedMap(db,
getKeyBinding(keyClass),
getEntityBinding(valueBaseClass),
writeAllowed);
}
/**
* Creates a <code>SecondaryKeyCreator</code> object for use in configuring
* a <code>SecondaryDatabase</code>. The returned object implements
* the {@link com.sleepycat.je.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.
*
* @param <V> the value base class.
*
* @return the key creator.
*/
public <V extends MarshalledTupleKeyEntity>
TupleSerialMarshalledKeyCreator<V>
getKeyCreator(Class<V> valueBaseClass, String keyName) {
return new TupleSerialMarshalledKeyCreator<V>
(getEntityBinding(valueBaseClass), keyName);
}
public <V extends MarshalledTupleKeyEntity>
TupleSerialMarshalledBinding<V>
getEntityBinding(Class<V> baseClass) {
return new TupleSerialMarshalledBinding<V>(catalog, baseClass);
}
private <K> EntryBinding<K> getKeyBinding(Class<K> keyClass) {
EntryBinding<K> binding = TupleBinding.getPrimitiveBinding(keyClass);
if (binding == null) {
/*
* Cannot use type param <K> here because it does not implement
* MarshalledTupleEntry if it is a primitive class.
*/
binding = new TupleMarshalledBinding(keyClass);
}
return binding;
}
}