/*
NeoDatis ODB : Native Object Database (odb.info@neodatis.org)
Copyright (C) 2007 NeoDatis Inc. http://www.neodatis.org

"This file is part of the NeoDatis ODB open source object database".

NeoDatis ODB is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

NeoDatis ODB is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
package org.neodatis.odb.core.layers.layer3;

import java.util.List;
import java.util.Map;

import org.neodatis.odb.DatabaseId;
import org.neodatis.odb.OID;
import org.neodatis.odb.Objects;
import org.neodatis.odb.TransactionId;
import org.neodatis.odb.Values;
import org.neodatis.odb.core.layers.layer1.introspector.IObjectIntrospector;
import org.neodatis.odb.core.layers.layer2.meta.ClassInfo;
import org.neodatis.odb.core.layers.layer2.meta.ClassInfoList;
import org.neodatis.odb.core.layers.layer2.meta.MetaModel;
import org.neodatis.odb.core.layers.layer2.meta.NonNativeObjectInfo;
import org.neodatis.odb.core.layers.layer2.meta.ObjectInfoHeader;
import org.neodatis.odb.core.layers.layer3.engine.CheckMetaModelResult;
import org.neodatis.odb.core.query.IQuery;
import org.neodatis.odb.core.query.IValuesQuery;
import org.neodatis.odb.core.query.criteria.ICriterion;
import org.neodatis.odb.core.transaction.ISession;
import org.neodatis.odb.core.trigger.DeleteTrigger;
import org.neodatis.odb.core.trigger.ITriggerManager;
import org.neodatis.odb.core.trigger.InsertTrigger;
import org.neodatis.odb.core.trigger.OIDTrigger;
import org.neodatis.odb.core.trigger.SelectTrigger;
import org.neodatis.odb.core.trigger.UpdateTrigger;
import org.neodatis.odb.impl.core.layers.layer3.oid.FullIDInfo;
import org.neodatis.odb.impl.core.query.criteria.CriteriaQuery;
import org.neodatis.tool.wrappers.list.IOdbList;

/**
 * The interface of all that a StorageEngine (Main concept in ODB) must do.
 * 
 * @author osmadja
 * 
 */
public interface IStorageEngine {

	OID store(OID oid, Object object);

	/**
	 * Store an object in an database.
	 * 
	 * To detect if object must be updated or insert, we use the cache. To
	 * update an object, it must be first selected from the database. When an
	 * object is to be stored, if it exist in the cache, then it will be
	 * updated, else it will be inserted as a new object. If the object is null,
	 * the cache will be used to check if the meta representation is in the
	 * cache
	 * 
	 */
	OID store(Object object);

	void deleteObjectWithOid(OID oid, boolean cascade);

	/**
	 * Actually deletes an object database
	 * @param object
	 * @param cascade
	 */
	public OID delete(Object object, boolean cascade);


	void close();

	long count(CriteriaQuery query);

	Values getValues(IValuesQuery query, int startIndex, int endIndex);

	Objects getObjects(IQuery query, boolean inMemory, int startIndex, int endIndex);

	Objects getObjects(Class clazz, boolean inMemory, int startIndex, int endIndex);

	/**
	 * Return Meta representation of objects
	 * 
	 * @param query
	 *            The query to select objects
	 * @param inMemory
	 *            To indicate if object must be all loaded in memory
	 * @param startIndex
	 *            First object index
	 * @param endIndex
	 *            Last object index
	 * @param returnOjects
	 *            To indicate if object instances must be created
	 * @return The list of objects @
	 * 
	 */
	Objects getObjectInfos(IQuery query, boolean inMemory, int startIndex, int endIndex, boolean returnOjects);

	IObjectReader getObjectReader();

	IObjectWriter getObjectWriter();

	ITriggerManager getTriggerManager();

	ISession getSession(boolean throwExceptionIfDoesNotExist);

	ISession buildDefaultSession();

	void commit();

	void rollback();

	OID getObjectId(Object object, boolean throwExceptionIfDoesNotExist);

	Object getObjectFromOid(OID oid);

	NonNativeObjectInfo getMetaObjectFromOid(OID oid);

	ObjectInfoHeader getObjectInfoHeaderFromOid(OID oid, boolean useCache);

	void defragmentTo(String newFileName);

	List getAllObjectIds();

	List getAllObjectIdInfos(String objectType, boolean displayObjects);

	/**
	 * @return Returns the currentIdBlockNumber.
	 */
	int getCurrentIdBlockNumber();

	/**
	 * @return Returns the currentIdBlockPosition.
	 */
	long getCurrentIdBlockPosition();

	/**
	 * @return Returns the currentIdBlockMaxId.
	 */
	OID getCurrentIdBlockMaxOid();

	OID getMaxOid();

	boolean isClosed();

	int getVersion();

	void addUpdateTriggerFor(String className, UpdateTrigger trigger);

	void addInsertTriggerFor(String className, InsertTrigger trigger);
	
	void addOidTriggerFor(String className, OIDTrigger trigger);

	void addDeleteTriggerFor(String className, DeleteTrigger trigger);

	void addSelectTriggerFor(String className, SelectTrigger trigger);

	void setVersion(int version);

	void setDatabaseId(DatabaseId databaseId);

	void setNbClasses(long nbClasses);

	void setLastODBCloseStatus(boolean lastCloseStatus);

	void setCurrentIdBlockInfos(long currentBlockPosition, int currentBlockNumber, OID maxId);

	void setMetaModel(MetaModel metaModel);

	IBaseIdentification getBaseIdentification();

	/**
	 * Write an object already transformed into meta representation!
	 * 
	 * @param oid
	 * @param nnoi
	 * @param position
	 * @param updatePointers
	 * @return te object position(or id (if <0, it is id)) @
	 */
	public OID writeObjectInfo(OID oid, NonNativeObjectInfo nnoi, long position, boolean updatePointers);

	/**
	 * Updates an object already transformed into meta representation!
	 * 
	 * 
	 * @param nnoi
	 *            The Object Meta representation
	 * @param forceUpdate
	 * @return The OID of the update object @
	 */
	public OID updateObject(NonNativeObjectInfo nnoi, boolean forceUpdate);

	void addSession(ISession session, boolean readMetamodel);

	/**
	 * 
	 * @param className
	 *            The class name on which the index must be created
	 * @param name
	 *            The name of the index
	 * @param indexFields
	 *            The list of fields of the index
	 * @param verbose
	 *            A boolean value to indicate of ODB must describe what it is
	 * doing @ @
	 */
	void addIndexOn(String className,  String name, String[] indexFields, boolean verbose, boolean acceptMultipleValuesForSameKey) ;

	void addCommitListener(ICommitListener commitListener);

	IOdbList getCommitListeners();

	/** Returns the object used to refactor the database */
	IRefactorManager getRefactorManager();

	void resetCommitListeners();

	/**
	 * Used to know if the storage engine is executed in local mode (embedded
	 * mode) or client server mode
	 */
	public boolean isLocal();

	/*
	 * Adds a list of class to the metamodel, if it already exists simply
	 * returns the original one
	 */
	public abstract ClassInfoList addClasses(ClassInfoList classInfoList);

	DatabaseId getDatabaseId();

	TransactionId getCurrentTransactionId();

	void setCurrentTransactionId(TransactionId transactionId);

	/** Used to reconnect an object to the current session */
	void reconnect(Object object);

	/**
	 * Used to disconnect the object from the current session. The object is
	 * removed from the cache
	 */
	void disconnect(Object object);

	/**
	 * 
	 * @param className
	 * @param indexName
	 * @param verbose
	 */
	void rebuildIndex(String className, String indexName, boolean verbose);
	
	/**
	 * 
	 * @param className
	 * @param indexName
	 * @param verbose
	 */
	public void deleteIndex(String className, String indexName, boolean verbose);

	/**
	 * Receive the current class info (loaded from current java classes present on classpath
	 * and check against the persisted meta model
	 * @param currentCIs
	 */
	public CheckMetaModelResult checkMetaModelCompatibility(Map currentCIs);
	
	public IObjectIntrospector buildObjectIntrospector();

	public IObjectWriter buildObjectWriter();

	public IObjectReader buildObjectReader();

	public ITriggerManager buildTriggerManager();
	
	public IObjectIntrospector getObjectIntrospector();

	/**
	 * @param clazz
	 * @param criterion
	 * @return
	 */
	CriteriaQuery criteriaQuery(Class clazz, ICriterion criterion);

	/**
	 * @param clazz
	 * @return
	 */
	CriteriaQuery criteriaQuery(Class clazz);

	
	
}
 

Ads help maintain this website.