/*
* This file is part of the HyperGraphDB source distribution. This is copyrighted
* software. For permitted uses, licensing options and redistribution, please see
* the LicensingInformation file at the root level of the distribution.
*
* Copyright (c) 2005-2010 Kobrix Software, Inc. All rights reserved.
*/
package org.hypergraphdb;
/**
* <p>
* The <code>HGHandleFactory</code> is used to manage persistent handles
* for the atoms of {@link HyperGraph} instance. One such factory is configured
* per HyperGraphDB instance via the {@link HGConfiguration} passed when the instance
* is opened. The factory is responsible for creating new {@link HGPersistentHandle}s
* that must be unique at least within the current database instance. Certain factories
* can also guarantee universal uniqueness (e.g. in a distributed environment or across
* the Internet). Factories are also responsible for creating handle out of their
* <code>String</code> or <code>byte[]</code> representations. The main requirement that
* a handle factory implementation must observe is that all
* persistent handles must be of the exact same <code>byte[]</code> size. For example, this
* rules out the use of URIs as persistent handles.
* </p>
*
* @author Borislav Iordanov
*/
public interface HGHandleFactory
{
/**
* <p>Construct and return a new, unique persistent handle. The handle
* is permanently unique. It can be persistent (serialized) and restored without
* ever conflicting with another handle.
* </p>
*/
HGPersistentHandle makeHandle();
/**
* <p>Construct a persistent handle from its string representation.</p>
*/
HGPersistentHandle makeHandle(String handleAsString);
/**
* <p>Construct a persistent handle from its byte array representation.</p>
*
* @param buffer The byte array holding the handle value.
*/
HGPersistentHandle makeHandle(byte [] buffer);
/**
* <p>Construct a persistent handle from its byte array representation where the byte array
* is part of a larger buffer and located at a particular offset.</p>
*
* @param buffer The byte array holding the handle value.
* @param offset The offset within <code>buffer</code> where the handle value starts.
*/
HGPersistentHandle makeHandle(byte [] buffer, int offset);
/**
* <p>Return the representation of a null persistent handle. A null
* handle is a single instance and therefore can be compared for equality by
* doing direct Java object reference comparison. A null handle can be
* recorded in storage as any other persistent handle - it refers to no
* value. Not that while HyperGraph's type system does not provide
* for <code>null</code> atom values or value projections, null references
* to values are permitted and supported through the null
* <code>HGPersistentHandle</code></p>
*/
HGPersistentHandle nullHandle();
/**
* <p>
* The <code>anyHandle</code> is a persistent handle constant that represents
* a "don't care" handle during querying and comparison operations. It can be used, for
* instance, when defining an <code>OrdererLinkCondition</code> in a query.
* </p>
*
* <p>
* For efficiency reasons, the <code>equals</code> method of the various implementations of
* the <code>HGHandle</code> interface ignore this constant, even though it would be
* more consistent to for <code>anyHandle.equals(x)</code> and <code>x.equals(anyHandle)</code>
* to always return true.
* </p>
*/
HGPersistentHandle anyHandle();
HGPersistentHandle topTypeHandle();
HGPersistentHandle nullTypeHandle();
HGPersistentHandle linkTypeHandle();
HGPersistentHandle subsumesTypeHandle();
}