blob: 4e84696e4e0c6ca60fd2d2b76ba12fa12a47a352 [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.bind.tuple;
import com.sleepycat.util.RuntimeExceptionWrapper;
/**
* A concrete <code>TupleTupleBinding</code> that delegates to the
* <code>MarshalledTupleEntry</code> and
* <code>MarshalledTupleKeyEntity</code> interfaces of the entity class.
*
* <p>This class calls the methods of the {@link MarshalledTupleEntry}
* interface to convert between the data entry and entity object. It calls the
* methods of the {@link MarshalledTupleKeyEntity} interface to convert between
* the key entry and the entity object. These two interfaces must both be
* implemented by the entity class.</p>
*
* @author Mark Hayes
*/
public class TupleTupleMarshalledBinding<E extends
MarshalledTupleEntry & MarshalledTupleKeyEntity>
extends TupleTupleBinding<E> {
private Class<E> cls;
/**
* Creates a tuple-tuple marshalled binding object.
*
* <p>The given class is used to instantiate entity objects using {@link
* Class#newInstance}, and therefore must be a public class and have a
* public no-arguments constructor. It must also implement the {@link
* MarshalledTupleEntry} and {@link MarshalledTupleKeyEntity}
* interfaces.</p>
*
* @param cls is the class of the entity objects.
*/
public TupleTupleMarshalledBinding(Class<E> cls) {
this.cls = cls;
// The entity class will be used to instantiate the entity object.
//
if (!MarshalledTupleKeyEntity.class.isAssignableFrom(cls)) {
throw new IllegalArgumentException
(cls.toString() +
" does not implement MarshalledTupleKeyEntity");
}
if (!MarshalledTupleEntry.class.isAssignableFrom(cls)) {
throw new IllegalArgumentException
(cls.toString() + " does not implement MarshalledTupleEntry");
}
}
// javadoc is inherited
public E entryToObject(TupleInput keyInput, TupleInput dataInput) {
/*
* This "tricky" binding returns the stored data as the entity, but
* first it sets the transient key fields from the stored key.
*/
E obj;
try {
obj = cls.newInstance();
} catch (IllegalAccessException e) {
throw RuntimeExceptionWrapper.wrapIfNeeded(e);
} catch (InstantiationException e) {
throw RuntimeExceptionWrapper.wrapIfNeeded(e);
}
if (dataInput != null) { // may be null if used by key extractor
obj.unmarshalEntry(dataInput);
}
if (keyInput != null) { // may be null if used by key extractor
obj.unmarshalPrimaryKey(keyInput);
}
return obj;
}
// javadoc is inherited
public void objectToKey(E object, TupleOutput output) {
object.marshalPrimaryKey(output);
}
// javadoc is inherited
public void objectToData(E object, TupleOutput output) {
object.marshalEntry(output);
}
}