package com.sleepycat.bind.tuple; import java.util.HashMap; import java.util.Map; import com.sleepycat.bind.EntryBinding; import com.sleepycat.je.DatabaseEntry; import de.ovgu.cide.jakutil.*; /** * An abstract <code>EntryBinding</code> that treats a key or data entry as a * tuple; it includes predefined bindings for Java primitive types. * <p> * This class takes care of converting the entries to/from {@link TupleInput}and {@link TupleOutput} objects. Its two abstract methods must be implemented * by a concrete subclass to convert between tuples and key or data objects. * </p> * <ul> * <li> {@link #entryToObject(TupleInput)} </li> * <li> {@link #objectToEntry(Object,TupleOutput)} </li> * </ul> * <p> * For key or data entries which are Java primitive classes (String, Integer, * etc) {@link #getPrimitiveBinding} may be used to return a builtin tuple * binding. A custom tuple binding for these types is not needed. * </p> * <p> * When a tuple binding is used as a key binding, it produces key values with a * reasonable default sort order. For more information on the default sort * order, see {@link com.sleepycat.bind.tuple.TupleOutput}. * </p> * @author Mark Hayes */ public abstract class TupleBinding extends TupleBase implements EntryBinding { private static final Map primitives=new HashMap(); static { addPrimitive(String.class,String.class,new StringBinding()); addPrimitive(Character.class,Character.TYPE,new CharacterBinding()); addPrimitive(Boolean.class,Boolean.TYPE,new BooleanBinding()); addPrimitive(Byte.class,Byte.TYPE,new ByteBinding()); addPrimitive(Short.class,Short.TYPE,new ShortBinding()); addPrimitive(Integer.class,Integer.TYPE,new IntegerBinding()); addPrimitive(Long.class,Long.TYPE,new LongBinding()); addPrimitive(Float.class,Float.TYPE,new FloatBinding()); addPrimitive(Double.class,Double.TYPE,new DoubleBinding()); } private static void addPrimitive( Class cls1, Class cls2, TupleBinding binding){ primitives.put(cls1,binding); primitives.put(cls2,binding); } /** * Creates a tuple binding. */ public TupleBinding(){ } public Object entryToObject( DatabaseEntry entry){ return entryToObject(entryToInput(entry)); } public void objectToEntry( Object object, DatabaseEntry entry){ TupleOutput output=getTupleOutput(object); objectToEntry(object,output); outputToEntry(output,entry); } /** * Constructs a key or data object from a {@link TupleInput} entry. * @param inputis the tuple key or data entry. * @return the key or data object constructed from the entry. */ public abstract Object entryToObject( TupleInput input); /** * Converts a key or data object to a tuple entry. * @param objectis the key or data object. * @param outputis the tuple entry to which the key or data should be written. */ public abstract void objectToEntry( Object object, TupleOutput output); /** * Creates a tuple binding for a primitive Java class. The following Java * classes are supported. * <ul> * <li><code>String</code></li> * <li><code>Character</code></li> * <li><code>Boolean</code></li> * <li><code>Byte</code></li> * <li><code>Short</code></li> * <li><code>Integer</code></li> * <li><code>Long</code></li> * <li><code>Float</code></li> * <li><code>Double</code></li> * </ul> * @param clsis the primitive Java class. * @return a new binding for the primitive class or null if the cls * parameter is not one of the supported classes. */ public static TupleBinding getPrimitiveBinding( Class cls){ return (TupleBinding)primitives.get(cls); } }