blob: 6e548d3949751ee6f1d081d7657696db1b5b59be [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.serial;
import java.io.Closeable;
import java.io.ObjectStreamClass;
import com.sleepycat.je.DatabaseException;
/**
* A catalog of class description information for use during object
* serialization.
*
* <p>A catalog is used to store class descriptions separately from serialized
* objects, to avoid redundantly stored information with each object.
* When serialized objects are stored in a database, a {@link
* StoredClassCatalog} should be used.</p>
*
* <p>This information is used for serialization of class descriptors or
* java.io.ObjectStreamClass objects, each of which represents a unique class
* format. For each unique format, a unique class ID is assigned by the
* catalog. The class ID can then be used in the serialization stream in place
* of the full class information. When used with {@link SerialInput} and
* {@link SerialOutput} or any of the serial bindings, the use of the catalog
* is transparent to the application.</p>
*
* @see <a href="SerialBinding.html#evolution">Class Evolution</a>
*
* @author Mark Hayes
*/
public interface ClassCatalog
/* <!-- begin JE only --> */
extends Closeable
/* <!-- end JE only --> */
{
/**
* Close a catalog database and release any cached resources.
*
* @throws DatabaseException if an error occurs closing the catalog
* database.
*/
public void close()
throws DatabaseException;
/**
* Return the class ID for the current version of the given class
* description.
* This is used for storing in serialization streams in place of a full
* class descriptor, since it is much more compact. To get back the
* ObjectStreamClass for a class ID, call {@link #getClassFormat(byte[])}.
* This function causes a new class ID to be assigned if the class
* description has changed.
*
* @param classDesc The class description for which to return the
* class ID.
*
* @return The class ID for the current version of the class.
*
* @throws DatabaseException if an error occurs accessing the catalog
* database.
*
* @throws ClassNotFoundException if the class does not exist.
*/
public byte[] getClassID(ObjectStreamClass classDesc)
throws DatabaseException, ClassNotFoundException;
/**
* Return the ObjectStreamClass for the given class ID. This may or may
* not be the current class format, depending on whether the class has
* changed since the class ID was generated.
*
* @param classID The class ID for which to return the class format.
*
* @return The class format for the given class ID, which may or may not
* represent the current version of the class.
*
* @throws DatabaseException if an error occurs accessing the catalog
* database.
*
* @throws ClassNotFoundException if the class does not exist.
*/
public ObjectStreamClass getClassFormat(byte[] classID)
throws DatabaseException, ClassNotFoundException;
/**
* Returns the ClassLoader to be used by bindings that use this catalog, or
* null if a default class loader should be used. The ClassLoader is used
* by {@link SerialBinding} to load classes whose description is stored in
* the catalog.
*
* <p>In BDB JE, the implementation of this method in {@link
* StoredClassCatalog} returns the ClassLoader property of the catalog
* database Environment. This ensures that the Environment's ClassLoader
* property is used for loading all user-supplied classes.</p>
*
* @return the ClassLoader or null.
*/
public ClassLoader getClassLoader();
}