/*
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.impl;
import java.net.Socket;
import java.util.Map;
import org.neodatis.odb.ODBRuntimeException;
import org.neodatis.odb.OID;
import org.neodatis.odb.OdbConfiguration;
import org.neodatis.odb.core.ICoreProvider;
import org.neodatis.odb.core.NeoDatisError;
import org.neodatis.odb.core.layers.layer1.introspector.IClassIntrospector;
import org.neodatis.odb.core.layers.layer1.introspector.IObjectIntrospector;
import org.neodatis.odb.core.layers.layer2.instance.IClassPool;
import org.neodatis.odb.core.layers.layer2.instance.IInstanceBuilder;
import org.neodatis.odb.core.layers.layer3.IBaseIdentification;
import org.neodatis.odb.core.layers.layer3.IBufferedIO;
import org.neodatis.odb.core.layers.layer3.IIdManager;
import org.neodatis.odb.core.layers.layer3.IOFileParameter;
import org.neodatis.odb.core.layers.layer3.IOSocketParameter;
import org.neodatis.odb.core.layers.layer3.IObjectReader;
import org.neodatis.odb.core.layers.layer3.IObjectWriter;
import org.neodatis.odb.core.layers.layer3.IRefactorManager;
import org.neodatis.odb.core.layers.layer3.IStorageEngine;
import org.neodatis.odb.core.layers.layer3.engine.IByteArrayConverter;
import org.neodatis.odb.core.layers.layer3.engine.IFileSystemInterface;
import org.neodatis.odb.core.query.IQuery;
import org.neodatis.odb.core.query.execution.IMatchingObjectAction;
import org.neodatis.odb.core.server.layers.layer1.IClientObjectIntrospector;
import org.neodatis.odb.core.server.layers.layer3.engine.IMessageStreamer;
import org.neodatis.odb.core.server.layers.layer3.engine.IServerStorageEngine;
import org.neodatis.odb.core.server.transaction.ISessionManager;
import org.neodatis.odb.core.transaction.ISession;
import org.neodatis.odb.core.transaction.ITransaction;
import org.neodatis.odb.core.transaction.IWriteAction;
import org.neodatis.odb.core.trigger.ITriggerManager;
import org.neodatis.odb.impl.core.layers.layer1.introspector.AndroidClassIntrospector;
import org.neodatis.odb.impl.core.layers.layer1.introspector.DefaultClassIntrospector;
import org.neodatis.odb.impl.core.layers.layer1.introspector.LocalObjectIntrospector;
import org.neodatis.odb.impl.core.layers.layer2.instance.LocalInstanceBuilder;
import org.neodatis.odb.impl.core.layers.layer2.instance.ODBClassPool;
import org.neodatis.odb.impl.core.layers.layer2.instance.ServerInstanceBuilder;
import org.neodatis.odb.impl.core.layers.layer3.buffer.MultiBufferedFileIO;
import org.neodatis.odb.impl.core.layers.layer3.engine.DefaultByteArrayConverter;
import org.neodatis.odb.impl.core.layers.layer3.engine.LocalObjectWriter;
import org.neodatis.odb.impl.core.layers.layer3.engine.LocalStorageEngine;
import org.neodatis.odb.impl.core.layers.layer3.engine.ObjectReader;
import org.neodatis.odb.impl.core.layers.layer3.oid.DefaultIdManager;
import org.neodatis.odb.impl.core.layers.layer3.refactor.DefaultRefactorManager;
import org.neodatis.odb.impl.core.oid.OdbClassOID;
import org.neodatis.odb.impl.core.oid.OdbObjectOID;
import org.neodatis.odb.impl.core.query.criteria.CollectionQueryResultAction;
import org.neodatis.odb.impl.core.server.layers.layer1.ClientObjectIntrospector;
import org.neodatis.odb.impl.core.server.layers.layer1.ServerObjectIntrospector;
import org.neodatis.odb.impl.core.server.layers.layer3.engine.ClientStorageEngine;
import org.neodatis.odb.impl.core.server.layers.layer3.engine.ServerObjectReader;
import org.neodatis.odb.impl.core.server.layers.layer3.engine.ServerObjectWriter;
import org.neodatis.odb.impl.core.server.layers.layer3.engine.ServerStorageEngine;
import org.neodatis.odb.impl.core.server.layers.layer3.oid.DefaultServerIdManager;
import org.neodatis.odb.impl.core.server.transaction.ServerSession;
import org.neodatis.odb.impl.core.server.transaction.SessionManager;
import org.neodatis.odb.impl.core.server.trigger.DefaultServerTriggerManager;
import org.neodatis.odb.impl.core.transaction.ClientSession;
import org.neodatis.odb.impl.core.transaction.DefaultTransaction;
import org.neodatis.odb.impl.core.transaction.DefaultWriteAction;
import org.neodatis.odb.impl.core.transaction.LocalSession;
import org.neodatis.odb.impl.core.trigger.DefaultTriggerManager;
import org.neodatis.tool.DLogger;
import org.neodatis.tool.wrappers.OdbSystem;
import org.neodatis.tool.wrappers.io.MessageStreamerBuilder;
import org.neodatis.tool.wrappers.io.OdbFile;
import org.neodatis.tool.wrappers.map.OdbHashMap;
/**
* The is the default implementation of ODB
*
* @author olivier
*
*/
public class DefaultCoreProvider implements ICoreProvider {
private static IClassPool classPool = new ODBClassPool();
private static IByteArrayConverter byteArrayConverter = new DefaultByteArrayConverter();
private static IClassIntrospector classIntrospector = null;
private static ISessionManager sessionManager = new SessionManager();
private static Map triggerManagers = new OdbHashMap();
public void init2() {
byteArrayConverter.init2();
if (osIsAndroid()) {
// One feature is currently not supported on Android : dynamic empty
// constructor creation
classIntrospector = new AndroidClassIntrospector();
} else {
classIntrospector = new DefaultClassIntrospector();
}
classIntrospector.init2();
sessionManager.init2();
}
private boolean osIsAndroid() {
String javaVendor = OdbSystem.getProperty("java.vendor");
if (javaVendor != null && javaVendor.equals("The Android Project")) {
return true;
}
return false;
}
public void resetClassDefinitions() {
classIntrospector.reset();
classPool.reset();
}
public IStorageEngine getClientStorageEngine(
IBaseIdentification baseIdentification) {
if (baseIdentification instanceof IOFileParameter) {
return new LocalStorageEngine(baseIdentification);
}
if (baseIdentification instanceof IOSocketParameter) {
IOSocketParameter p = (IOSocketParameter) baseIdentification;
return new ClientStorageEngine(p);
}
throw new ODBRuntimeException(NeoDatisError.UNSUPPORTED_IO_TYPE
.addParameter(baseIdentification.toString()));
}
public IObjectWriter getClientObjectWriter(IStorageEngine engine) {
return new LocalObjectWriter(engine);
}
public IObjectReader getClientObjectReader(IStorageEngine engine) {
return new ObjectReader(engine);
}
public IObjectWriter getServerObjectWriter(IStorageEngine engine) {
return new ServerObjectWriter(engine);
}
public IObjectReader getServerObjectReader(IStorageEngine engine) {
return new ServerObjectReader(engine);
}
public IServerStorageEngine getServerStorageEngine(
IBaseIdentification baseIdentification) {
return new ServerStorageEngine(baseIdentification);
}
public IByteArrayConverter getByteArrayConverter() {
return byteArrayConverter;
}
/**
* TODO Return a list of IO to enable replication or other IO mechanism Used
* by the FileSystemInterface to actual write/read byte to underlying
* storage
*
* @param name
* The name of the buffered io
* @param parameters
* The parameters that define the buffer
* @param bufferSize
* The size of the buffers
* @return The buffer implementation @
*/
public IBufferedIO getIO(String name, IBaseIdentification parameters,
int bufferSize) {
if (parameters instanceof IOFileParameter) {
IOFileParameter fileParameters = (IOFileParameter) parameters;
// Guarantee that file directory structure exist
OdbFile f = new OdbFile(fileParameters.getFileName());
OdbFile fparent = f.getParentFile();
if (fparent != null && !fparent.exists()) {
DLogger.debug(fparent + " does not exist, creating it.");
fparent.mkdirs();
}
return new MultiBufferedFileIO(OdbConfiguration.getNbBuffers(),
name, fileParameters.getFileName(), fileParameters
.canWrite(), bufferSize);
}
/*
* if(parameters.getClass() == IOSocketParameter.class){
* IOSocketParameter socketParameters = (IOSocketParameter) parameters;
* return new MultiBufferedNetIO(Configuration.getNbBuffers(),
* name,session
* ,socketParameters.getBaseIdentifier(),socketParameters.getDestinationHost
* (),socketParameters.getPort(),bufferSize); }
*/
throw new ODBRuntimeException(NeoDatisError.UNSUPPORTED_IO_TYPE
.addParameter(parameters.toString()));
}
/**
* Returns the Local Instance Builder
*/
public IInstanceBuilder getLocalInstanceBuilder(IStorageEngine engine) {
return new LocalInstanceBuilder(engine);
}
/**
* Returns the Server Instance Builder
*/
public IInstanceBuilder getServerInstanceBuilder(IStorageEngine engine) {
return new ServerInstanceBuilder(engine);
}
public IObjectIntrospector getLocalObjectIntrospector(IStorageEngine engine) {
return new LocalObjectIntrospector(engine);
}
public IClientObjectIntrospector getClientObjectIntrospector(
IStorageEngine engine, String connectionId) {
return new ClientObjectIntrospector(engine,connectionId);
}
public IObjectIntrospector getServerObjectIntrospector(IStorageEngine engine) {
return new ServerObjectIntrospector(engine);
}
public ITriggerManager getLocalTriggerManager(IStorageEngine engine) {
// First check if trigger manager has already been built for the engine
ITriggerManager triggerManager = triggerManagers.get(engine);
if(triggerManager!=null){
return triggerManager;
}
triggerManager = new DefaultTriggerManager(engine);
triggerManagers.put(engine, triggerManager);
return triggerManager;
}
public void removeLocalTriggerManager(IStorageEngine engine) {
triggerManagers.remove(engine);
}
public ITriggerManager getServerTriggerManager(IStorageEngine engine) {
return new DefaultServerTriggerManager(engine);
}
public IClassIntrospector getClassIntrospector() {
return classIntrospector;
}
public IIdManager getClientIdManager(IStorageEngine engine) {
return new DefaultIdManager(engine.getObjectWriter(), engine
.getObjectReader(), engine.getCurrentIdBlockPosition(), engine
.getCurrentIdBlockNumber(), engine.getCurrentIdBlockMaxOid());
}
public IIdManager getServerIdManager(IStorageEngine engine) {
return new DefaultServerIdManager(engine.getObjectWriter(), engine
.getObjectReader(), engine.getCurrentIdBlockPosition(), engine
.getCurrentIdBlockNumber(), engine.getCurrentIdBlockMaxOid());
}
// Transaction related
public ISessionManager getClientServerSessionManager() {
return sessionManager;
}
public IWriteAction getWriteAction(long position, byte[] bytes) {
return new DefaultWriteAction(position, bytes);
}
public ITransaction getTransaction(ISession session,
IFileSystemInterface fsi) {
return new DefaultTransaction(session, fsi);
}
public ISession getLocalSession(IStorageEngine engine) {
return new LocalSession(engine);
}
public ISession getClientSession(IStorageEngine engine) {
return new ClientSession(engine);
}
public ISession getServerSession(IStorageEngine engine, String sessionId) {
return new ServerSession(engine, sessionId);
}
public IRefactorManager getRefactorManager(IStorageEngine engine) {
return new DefaultRefactorManager(engine);
}
// For query result handler
public IMatchingObjectAction getCollectionQueryResultAction(
IStorageEngine engine, IQuery query, boolean inMemory,
boolean returnObjects) {
return new CollectionQueryResultAction(query, inMemory, engine,
returnObjects, engine.getObjectReader().getInstanceBuilder());
}
// OIDs
public OID getObjectOID(long objectOid, long classOid) {
return new OdbObjectOID(objectOid);
}
public OID getClassOID(long oid) {
return new OdbClassOID(oid);
}
public OID getExternalObjectOID(long objectOid, long classOid) {
return new OdbObjectOID(objectOid);
}
public OID getExternalClassOID(long oid) {
return new OdbClassOID(oid);
}
public IClassPool getClassPool() {
return classPool;
}
/** (non-Javadoc)
* @see org.neodatis.odb.core.ICoreProvider#getMessageStreamer(java.net.Socket)
*
*/
public IMessageStreamer getMessageStreamer(Socket socket) {
return MessageStreamerBuilder.getMessageStreamer(socket);
}
/**
*
*/
public IMessageStreamer getMessageStreamer(String host, int port, String name) {
return MessageStreamerBuilder.getMessageStreamer(host, port, name);
}
}
Ads help maintain this website.