/*
* 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.type;
import org.hypergraphdb.HGGraphHolder;
import org.hypergraphdb.HGHandle;
/**
*
* <p>
* A <code>JavaTypeMapper</code> is used to create HyperGraphDB type out of Java classes and
* to provide appropriate run-time representations.
* </p>
*
* <p>
* When the type an atom of an unknown Java class is first requested, the type system must
* create an appropriate HyperGraphDB type using Java reflection on the class. The HyperGraphDB
* type should be portable and potentially usable from other languages such as C++. For example
* a plain Java bean is usually translated into the general <code>RecordType</code>.
* </p>
*
* <p>
* The HyperGraphDB type, being general, doesn't have to necessarily create objects of the
* original Java class. In other words
* </p>
*
* @author Borislav Iordanov
*
*/
public interface JavaTypeMapper extends HGGraphHolder
{
/**
* <p>
* Create a new HyperGraphDB type for the given Java class. The <code>HGHandle</code>
* of the type pre-created and provided as a parameter.
* </p>
*
* <p>
* This method should return a brand new <code>HGAtomType</code> that will subsequently
* be saved as a type atom with handle <code>typeHandle</code> and associated with
* the <code>javaClass</code> class. The method should return <code>null</code> in
* case it cannot (or it determines that it should not) create a <code>HGAtomType</code>.
* In the case the JavaTypeFactory will move on to try the next of the registered
* type mappers.
* </p>
*
* @param javaClass
* @param typeHandle
* @return A newly created <code>HGAtomType</code> corresponding to the passed in Java
* class or <code>null</code> if such a type could not be created.
*/
HGAtomType defineHGType(Class<?> javaClass,
HGHandle typeHandle);
/**
* <p>
* Create a type wrapper for a given raw HyperGraphDB type. The type wrapper should
* work with the regular Java runtime instance of an atom and use the underlying
* HG type for actual storage and retrieval.
* </p>
*
* @param typeHandle The handle of the type being wrapped.
* @param hgType The HyperGraphDB type instance to be wrapped
* @param javaClass The Java class corresponding to this HyperGraphDB type.
* @return The type wrapper or <code>null</code> if
*/
HGAtomType getJavaBinding(HGHandle typeHandle,
HGAtomType hgType,
Class<?> javaClass);
}