/* * Copyright (c) 2010-2013, 2015, 2016 Eike Stepper (Berlin, Germany) and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Simon McDuff - initial API and implementation * Ibrahim Sallam - code refactoring for CDO 3.0 */ package org.eclipse.emf.cdo.server.internal.objectivity; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.branch.CDOBranchHandler; import org.eclipse.emf.cdo.common.branch.CDOBranchManager; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.branch.CDOBranchVersion; import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.common.commit.CDOCommitInfoHandler; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDExternal; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.lob.CDOLobHandler; import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockArea.Handler; import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; import org.eclipse.emf.cdo.common.model.EMFUtil; import org.eclipse.emf.cdo.common.protocol.CDODataInput; import org.eclipse.emf.cdo.common.protocol.CDODataOutput; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionCacheAdder; import org.eclipse.emf.cdo.common.revision.CDORevisionHandler; import org.eclipse.emf.cdo.common.revision.CDORevisionManager; import org.eclipse.emf.cdo.common.util.CDOCommonUtil; import org.eclipse.emf.cdo.server.IQueryHandler; import org.eclipse.emf.cdo.server.IRepository; import org.eclipse.emf.cdo.server.ISession; import org.eclipse.emf.cdo.server.IStoreAccessor.DurableLocking; import org.eclipse.emf.cdo.server.ITransaction; import org.eclipse.emf.cdo.server.internal.objectivity.bundle.OM; import org.eclipse.emf.cdo.server.internal.objectivity.clustering.ObjyPlacementManagerLocal; import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjyCommitInfoHandler; import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjyObject; import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjyObjectManager; import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjyPackageHandler; import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjySchema; import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjySession; import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyBase; import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyBranch; import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyBranchManager; import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyCommitInfo; import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyLockAreaManager; import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyResourceList; import org.eclipse.emf.cdo.server.internal.objectivity.utils.OBJYCDOIDUtil; import org.eclipse.emf.cdo.server.internal.objectivity.utils.SmartLock; import org.eclipse.emf.cdo.server.objectivity.IObjectivityStoreAccessor; import org.eclipse.emf.cdo.server.objectivity.IObjectivityStoreChunkReader; import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranch; import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager; import org.eclipse.emf.cdo.spi.common.commit.CDOChangeSetSegment; import org.eclipse.emf.cdo.spi.common.commit.InternalCDOCommitInfoManager; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit; import org.eclipse.emf.cdo.spi.common.revision.DetachedCDORevision; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionDelta; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager; import org.eclipse.emf.cdo.spi.server.InternalCommitContext; import org.eclipse.emf.cdo.spi.server.InternalRepository; import org.eclipse.emf.cdo.spi.server.InternalSessionManager; import org.eclipse.emf.cdo.spi.server.StoreAccessor; import org.eclipse.net4j.util.ObjectUtil; import org.eclipse.net4j.util.collection.Pair; import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType; import org.eclipse.net4j.util.om.monitor.OMMonitor; import org.eclipse.net4j.util.om.monitor.OMMonitor.Async; import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.resource.ResourceSet; import com.objy.db.LockNotGrantedException; import com.objy.db.app.oo; import com.objy.db.app.ooId; import com.objy.db.app.ooObj; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedSet; /** * @author Simon McDuff * @author Ibrahim Sallam */ public class ObjectivityStoreAccessor extends StoreAccessor implements IObjectivityStoreAccessor, DurableLocking { private static final ContextTracer TRACER_DEBUG = new ContextTracer(OM.DEBUG, ObjectivityStoreAccessor.class); private static final ContextTracer TRACER_INFO = new ContextTracer(OM.INFO, ObjectivityStoreAccessor.class); protected ObjySession objySession = null; // protected ObjyObjectManager objectManager = null; protected boolean isRead = false; protected int sessionID = 0; // used to tag the Objy session in the session pool boolean zipped = true; // TODO - might make this configurable... private Map<CDOID, ObjyObject> newObjyObjectsMap = CDOIDUtil.createMap(); private long readRevisionTime = 0; private int readRevisionCount = 0; protected ObjectivityStoreAccessor(ObjectivityStore store, ISession cdoSession) { super(store, cdoSession); // for debugging... // session.getProtocol(); // org.eclipse.emf.cdo.net4j.CDOSession.Options.getProtocol() // [12:42:23 PM] Eike Stepper says: org.eclipse.net4j.signal.ISignalProtocol.setTimeout(long) // [12:42:43 PM] Eike Stepper says: commit is different // if (cdoSession != null && cdoSession.getProtocol().getSession() instanceof org.eclipse.emf.cdo.net4j.CDOSession) // { // CDOCommonSession commonSession = cdoSession.getProtocol().getSession(); // org.eclipse.emf.cdo.net4j.CDOSession tempSession = (org.eclipse.emf.cdo.net4j.CDOSession)commonSession; // tempSession.options().setCommitTimeout(60000); // } // [12:42:45 PM] Eike Stepper says: org.eclipse.emf.cdo.net4j.CDOSession.Options.setCommitTimeout(int) // org.eclipse.emf.cdo.net4j.CDOSession.Options.setProgressInterval(int) /* I believe this is a read session */ isRead = true; if (cdoSession != null) { sessionID = cdoSession.getSessionID(); } } public ObjectivityStoreAccessor(ObjectivityStore store, ITransaction transaction) { super(store, transaction); // for debugging... // if (transaction != null && transaction.getSession().getProtocol().getSession() instanceof // org.eclipse.emf.cdo.net4j.CDOSession) // { // CDOCommonSession commonSession = transaction.getSession().getProtocol().getSession(); // org.eclipse.emf.cdo.net4j.CDOSession cdoSession = (org.eclipse.emf.cdo.net4j.CDOSession)commonSession; // cdoSession.options().setCommitTimeout(60000); // } /* I believe this is a write session */ if (transaction != null) { sessionID = transaction.getSession().getSessionID(); } } @Override protected void detachObjects(CDOID[] detachedObjects, CDOBranch branch, long timeStamp, OMMonitor monitor) { ensureSessionBegin(); // System.out.println(">>>>IS:<<< detachObjects() " + this + " - objy session: " + objySession.toString()); // objySession.addToLog("IS:>>>", "detachObjects - begin"); try { monitor.begin(detachedObjects.length); // Find all Objy containers to lock as one unit. Set<ooId> containerToLocks = new HashSet<ooId>(); for (CDOID id : detachedObjects) { ooId containerID = OBJYCDOIDUtil.getContainerId(id); containerToLocks.add(containerID); } objySession.lockContainers(containerToLocks); InternalCDORevisionManager revisionManager = getStore().getRepository().getRevisionManager(); long tStart = System.currentTimeMillis(); for (CDOID id : detachedObjects) { InternalCDORevision revision = revisionManager.getRevision(id, branch.getHead(), CDORevision.UNCHUNKED, CDORevision.DEPTH_NONE, true); int version = ObjectUtil.equals(branch, revision.getBranch()) ? revision.getVersion() : CDOBranchVersion.FIRST_VERSION; detachObject(id, version, branch, timeStamp); } // objySession.addToLog("IS:>>>", "detachObjects - end"); long tDiff = System.currentTimeMillis() - tStart; if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace("detach objects: " + detachedObjects.length + " - time: " + tDiff); } } finally { monitor.done(); } // System.out.println(">>>>IS:<<< detachObjects() DONE " + this + " - objy session: " + objySession.toString()); } /*** * @param CDOID * @param version * @param branch * @param timeStamp */ private void detachObject(CDOID id, int version, CDOBranch branch, long timeStamp) { // ensureSessionBegin(); ObjyObject objyObject = getObject(id); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace("Detaching id " + id + " - OID: " + objyObject.ooId().getStoreString() + " verions: " + version + " in Branch: " + branch.getID() + " and timeStamp: " + timeStamp); } if (getStore().isRequiredToSupportAudits()) { if (version > CDOBranchVersion.FIRST_VERSION) { // pick the proper version of that branch to revise it. Otherwise, the detached version will // be in a different branch. ObjyObject objyRevision = objyObject.getRevisionByVersion(version, branch.getID(), objySession.getObjectManager()); if (objyRevision.getVersion() < 0) { TRACER_DEBUG.trace("... OBJ is already detached..."); } objyRevision.setRevisedTime(timeStamp - 1); } objyObject.detach(version, branch, timeStamp); } else { objyObject.setVersion(-version); objyObject.delete(this, objySession.getObjectManager()); } // // we'll need to find it's containing object/resource and remove it from there. // // TODO - do we need to deal with dependent objects, i.e. delete them as well, // // is there a notion of delete propagate? // if (ObjySchema.isResource(getStore(), objyObject.objyClass())) // { // ObjyResourceList resourceList = objySession.getResourceList(getRepositoryName()); // resourceList.remove(objyObject); // } objySession.getObjectManager().remove(objyObject); // removed it from the cache. } @Override protected void doActivate() throws Exception { // System.out.println(">>>>IS:<<<< StoreAccessor.doActivate() " + this); // getObjySession(); } public ObjySession getObjySession() { int currSessionID = sessionID; if (!isReader()) { // The only reason we do this is because there was a switching of context in the middle // of a transaction, and we want to ensure that we continue with the proper session that // is holding the data. ITransaction cdoTrx = getTransaction(); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace("getObjySession() - context's transaction: " + (cdoTrx == null ? "null" : cdoTrx.toString())); } if (cdoTrx != null) { sessionID = cdoTrx.getSession().getSessionID(); } } if (objySession != null && currSessionID == sessionID) { return objySession; } // get a session name. String sessionName = "Session_" + sessionID; if (objySession != null) { objySession.returnSessionToPool(); } if (isReader()) { objySession = getStore().getConnection().getReadSessionFromPool(sessionName + "_" + getRepositoryName()); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace(" getObjySession from read pool, session: " + objySession.toString() + " - isOpen: " + objySession.isOpen() + " - sessionName:" + objySession.getName()); } } else { objySession = getStore().getConnection().getWriteSessionFromPool(sessionName + "_" + getRepositoryName()); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace(" getObjySession from write pool, session: " + objySession.toString() + " - isOpen: " + objySession.isOpen() + " - sessionName:" + objySession.getName()); } } if (!objySession.isOpen()) { objySession.setMrowMode(oo.MROW); objySession.setWaitOption(45000); objySession.setAllowUnregisterableTypes(true); if (isRead) { objySession.setOpenMode(oo.openReadOnly); } else { objySession.setOpenMode(oo.openReadWrite); } objySession.begin(); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace(" calling session.begin() for " + objySession.toString() + " - isRead: " + isRead); } } else { if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace(" session " + objySession.toString() + " already open."); } } return objySession; } private void returnObjySession() { // System.out.println(">>>>IS:<<<< Returning to pool, session: " + objySession + " - name: " + // objySession.getName()); ensureSessionJoin(); // testDetachWithoutRevision_CheckMainBranch() is crashing because objySession is null. // TBD: verify this case!!! if (objySession == null) { return; } if (objySession.isOpen()) { // System.out.println(">>>>IS:<<<< commiting session: " + objySession + " - name: " + objySession.getName()); objySession.commit(); // IS: we might need to abort instead. } objySession.returnSessionToPool(); objySession = null; } @Override protected void doDeactivate() throws Exception { // System.out.println(">>>>IS:<<< StoreAccessor.doDeactivate() " + this); returnObjySession(); } @Override protected void doPassivate() throws Exception { // System.out.println(">>>>IS:<<<< StoreAccessor.doPassivate() " + this); returnObjySession(); } @Override protected void doUnpassivate() throws Exception { // System.out.println(">>>>IS:<<<< StoreAccessor.doUnpassivate() " + this); // IS: don't call this now, in case we don't have a context. // getObjySession(); } // @Override // protected void setContext(Object context) // { // super.setContext(context); // System.out.println(">>>>IS:<<<< StoreAccessor.setContext() " + this + " - context: " + context.toString()); // } @Override protected void doRollback(CommitContext commitContext) { try { if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace("Rollback session " + objySession); } // the rollback could be coming from another thread. ensureSessionJoin(); if (objySession.isOpen()) { objySession.abort(); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace("OBJY: session aborted - Session: " + objySession + " - open:" + objySession.isOpen()); } } } catch (RuntimeException exception) { TRACER_INFO.trace(exception.getMessage(), exception); exception.printStackTrace(); throw exception; } } @Override protected void writeRevisionDeltas(InternalCDORevisionDelta[] revisionDeltas, CDOBranch branch, long created, OMMonitor monitor) { // System.out.println(">>>>IS:<<< writeRevisionDeltas() " + this + " - objy session: " + objySession.toString()); long start = System.nanoTime(); ensureSessionBegin(); try { monitor.begin(revisionDeltas.length); // Find all Objy containers to lock as one unit. Set<ooId> containerToLocks = new HashSet<ooId>(); for (InternalCDORevisionDelta delta : revisionDeltas) { ooId containerID = OBJYCDOIDUtil.getContainerId(delta.getID()); containerToLocks.add(containerID); } objySession.lockContainers(containerToLocks); for (InternalCDORevisionDelta revisionDelta : revisionDeltas) { writeRevisionDelta(revisionDelta, branch, created); } } finally { monitor.done(); } if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace(" writeRevisionDeltas: " + revisionDeltas.length + " - time: " + (System.nanoTime() - start) / 1000000.0); } } /** * Called for each revision delta. * * @param delta * @param created * @param branch */ // private void writeRevisionDelta2(InternalCDORevisionDelta delta, CDOBranch branch, long created) // { // // ensureSessionBegin(); // // int deltaVersion = delta.getVersion(); // int newVersion = CDOBranchVersion.FIRST_VERSION; // // ObjyObject objyObject = getObject(delta.getID()); // if (TRACER_DEBUG.isEnabled()) // { // TRACER_DEBUG.format("writingRevisionDelta getting Object: {0}, v:{1} - BranchId:{2}", objyObject.ooId() // .getStoreString(), deltaVersion, delta.getBranch().getID()); // } // ObjyObject objyOriginalRevision = objyObject.getRevisionByVersion(deltaVersion, delta.getBranch().getID(), // objySession.getObjectManager()); // // if (branch.getID() == delta.getBranch().getID()) // { // // Same branch, increase version // newVersion = deltaVersion + 1; // } // // if (TRACER_DEBUG.isEnabled()) // { // TRACER_DEBUG.format("Writing revision delta: {0}, v:{1} - OID:{2}, v:{3} - BranchId:{4}", delta, deltaVersion, // objyObject.ooId().getStoreString(), objyOriginalRevision.getVersion(), objyOriginalRevision.getBranchId()); // TRACER_DEBUG.format("... delta branch ID: {0} - revision branch ID: {1}", branch.getID(), // objyOriginalRevision.getBranchId()); // } // // System.out.println(">>>IS: Delta Writing: " + delta.getID() + " - oid: " + objyObject.ooId().getStoreString()); // // System.out.println("\t - old version : " + delta.getVersion()); // // System.out.println("\t - created : " + created); // // System.out.println("\t - delta.branch: " + delta.getBranch().toString()); // // System.out.println("\t - branch : " + branch.toString()); // // System.out.println("\t - branch TS : " + branch.getPoint(created).getTimeStamp()); // // System.out.println("\t - delta : " + delta.toString()); // // for debugging... // // if (objyOriginalRevision.getVersion() != deltaVersion) // { // throw new RuntimeException("ObjecitivityStoreAccessor : Dirty write"); // } // // ObjyObject objyNewRevision = null; // // if (getStore().isRequiredToSupportAudits()) // { // // newObjyRevision = objySession.getObjectManager().copyRevision(this, objyRevision); // // objyRevision.setRevisedBranchId(branch.getID(); // // InternalCDORevision originalRevision = getStore().getRepository().getRevisionManager() // // .getRevisionByVersion(delta.getID(), delta, 0, true); // InternalCDORevision originalRevision = getStore().getRepository().getRevisionManager() // .getRevisionByVersion(delta.getID(), delta.getBranch().getVersion(deltaVersion), 0, true); // // // 100917-IS: KISS - InternalCDORevision newRevision = originalRevision.copy(); // // // 100917-IS: KISS - newRevision.setVersion(deltaVersion + 1); // // 100917-IS: KISS - newRevision.setBranchPoint(delta.getBranch().getPoint(created)); // // 100917-IS: KISS - newObjyRevision = objySession.getObjectManager().newObject(newRevision.getEClass(), // // objyRevision.ooId()); // // 100917-IS: KISS - objyNewRevision.update(this, newRevision); // // // create a new object, fill it with the original revision data, then // // modify the creation and the branch ID accordingly. // objyNewRevision = objySession.getObjectManager().newObject(originalRevision.getEClass(), // objyOriginalRevision.ooId()); // objyNewRevision.update(this, originalRevision); // objyNewRevision.setBranchId(delta.getBranch().getID()); // // the following are done at the end. // // objyNewRevision.setVersion(deltaVersion + 1); // // objyNewRevision.setCreationTime(created); // // objyObject.addToRevisions(objyNewRevision); // // if (getStore().isRequiredToSupportBranches() /* && branch.getID() != CDOBranch.MAIN_BRANCH_ID */) // { // // add the newObjyRevision to the proper branch. // ObjyBranch objyBranch = objySession.getBranchManager(getRepositoryName()).getBranch(branch.getID()); // ooObj anObj = ooObj.create_ooObj(objyNewRevision.ooId()); // objyBranch.addRevision(anObj); // } // if (newVersion > CDORevision.FIRST_VERSION) // { // // revise the original revision last, otherwise we can end up with the revised date in the new revision. // objyOriginalRevision.setRevisedTime(branch.getPoint(created).getTimeStamp() - 1); // } // } // else // { // objyNewRevision = objyOriginalRevision; // } // // ObjectivityFeatureDeltaWriter visitor = new ObjectivityFeatureDeltaWriter(objyNewRevision); // // delta.accept(visitor); // // objyNewRevision.setCreationTime(branch.getPoint(created).getTimeStamp()); // objyNewRevision.setVersion(newVersion); // TODO - verify with Eike if this is true!!! // } /** * Called for each revision delta. * * @param delta * @param created * @param branch */ private void writeRevisionDelta(InternalCDORevisionDelta delta, CDOBranch branch, long created) { // ensureSessionBegin(); int deltaVersion = delta.getVersion(); int newVersion = CDOBranchVersion.FIRST_VERSION; ObjyObject objyObject = getObject(delta.getID()); TRACER_DEBUG.format("writingRevisionDelta getting Object: {0}, v:{1} - BranchId:{2}", objyObject.ooId().getStoreString(), deltaVersion, delta.getBranch().getID()); ObjyObject objyOriginalRevision = objyObject.getRevisionByVersion(deltaVersion, delta.getBranch().getID(), objySession.getObjectManager()); if (branch.getID() == delta.getBranch().getID()) { // Same branch, increase version newVersion = deltaVersion + 1; } if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("Writing revision delta: {0}, v:{1} - OID:{2}, v:{3} - BranchId:{4}", delta, deltaVersion, objyObject.ooId().getStoreString(), objyOriginalRevision.getVersion(), objyOriginalRevision.getBranchId()); TRACER_DEBUG.format("... delta branch ID: {0} - revision branch ID: {1}", branch.getID(), objyOriginalRevision.getBranchId()); } // System.out.println(">>>IS: Delta Writing: " + delta.getID() + " - oid: " + objyObject.ooId().getStoreString()); // System.out.println("\t - old version : " + delta.getVersion()); // System.out.println("\t - created : " + created); // System.out.println("\t - delta.branch: " + delta.getBranch().toString()); // System.out.println("\t - branch : " + branch.toString()); // System.out.println("\t - branch TS : " + branch.getPoint(created).getTimeStamp()); // System.out.println("\t - delta : " + delta.toString()); // for debugging... if (objyOriginalRevision.getVersion() != deltaVersion) { throw new RuntimeException("ObjecitivityStoreAccessor : Dirty write"); } ObjyObject objyNewRevision = null; if (getStore().isRequiredToSupportAudits()) { ObjyObject objyObjectCopy = objySession.getObjectManager().copyRevision(this, objyOriginalRevision); TRACER_DEBUG.format(" created new object:{0} by copying object:{1} - v:{2} - newBranch:{3}", objyObjectCopy.ooId().getStoreString(), objyOriginalRevision.ooId().getStoreString(), objyOriginalRevision.getVersion(), branch.getID()); // // newObjyRevision = objySession.getObjectManager().copyRevision(this, objyRevision); // // objyRevision.setRevisedBranchId(branch.getID(); // InternalCDORevision originalRevision = getStore().getRepository().getRevisionManager() // .getRevisionByVersion(delta.getID(), delta, CDORevision.UNCHUNKED, true); // // // 100917-IS: KISS - InternalCDORevision newRevision = originalRevision.copy(); // // // 100917-IS: KISS - newRevision.setVersion(deltaVersion + 1); // // 100917-IS: KISS - newRevision.setBranchPoint(delta.getBranch().getPoint(created)); // // 100917-IS: KISS - objyNewRevision = objySession.getObjectManager().newObject(newRevision.getEClass(), // // objyOriginalRevision.ooId()); // // 100917-IS: KISS - objyNewRevision.update(this, newRevision); // // // create a new object, fill it with the original revision data, then // // modify the creation and the branch ID accordingly. // objyNewRevision = objySession.getObjectManager().newObject(originalRevision.getEClass(), // objyOriginalRevision.ooId()); // objyNewRevision.update(this, originalRevision); objyNewRevision = objyObjectCopy; objyNewRevision.setBranchId(branch.getID()); // the following are done at the end. // objyNewRevision.setVersion(deltaVersion + 1); // objyNewRevision.setCreationTime(created); objyObject.addToRevisions(objyNewRevision); if (getStore().isRequiredToSupportBranches() /* && branch.getID() != CDOBranch.MAIN_BRANCH_ID */) { // add the newObjyRevision to the proper branch. ObjyBranch objyBranch = objySession.getBranchManager(getRepositoryName()).getBranch(branch.getID()); ooObj anObj = ooObj.create_ooObj(objyNewRevision.ooId()); objyBranch.addRevision(anObj); } // revise the original revision last, otherwise we can end up with the revised date in the new revision. // IS: it seems that in CDO 4.0 we don't need to do that anymore!! if (newVersion > CDORevision.FIRST_VERSION) { objyOriginalRevision.setRevisedTime(branch.getPoint(created).getTimeStamp() - 1); } } else { objyNewRevision = objyOriginalRevision; } ObjectivityFeatureDeltaWriter visitor = new ObjectivityFeatureDeltaWriter(objyNewRevision); delta.accept(visitor); objyNewRevision.setCreationTime(branch.getPoint(created).getTimeStamp()); objyNewRevision.setVersion(newVersion); // TODO - verify with Eike if this is true!!! } @Override public ObjectivityStore getStore() { return (ObjectivityStore)super.getStore(); } /** * It seems that it will be called for both new objects and dirty objects. */ @Override protected void writeRevisions(InternalCDORevision[] revisions, CDOBranch branch, OMMonitor monitor) { if (TRACER_DEBUG.isEnabled()) { ObjyObjectManager.getObjectTime = 0; ObjyObjectManager.updateObjectTime = 0; ObjyObjectManager.resourceCheckAndUpdateTime = 0; } long start = System.nanoTime(); ensureSessionBegin(); // objySession.addToLog("IS:>>>", "writeRevisions - begin"); try { monitor.begin(revisions.length); // Find all Objy containers to lock as one unit. Set<ooId> containersToLock = new HashSet<ooId>(); for (InternalCDORevision revision : revisions) { ooId containerID = OBJYCDOIDUtil.getContainerId(revision.getID()); containersToLock.add(containerID); } // containersToLock.add(objySession.getBranchManager(getRepositoryName()).getContainer().getOid()); // lockContainers(containersToLock); // long tStart = System.currentTimeMillis(); for (InternalCDORevision revision : revisions) { writeRevision(revision, monitor.fork()); } // long tDiff = System.currentTimeMillis() - tStart; // System.out.println(">>> IS: writing revisions: " + revisions.length + " - time: " + tDiff); } finally { newObjyObjectsMap.clear(); monitor.done(); } // objySession.addToLog("IS:>>>", "writeRevisions - end"); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace(" writeRevisions: " + revisions.length + " - time: " + (System.nanoTime() - start) / 1000000.0); // TRACER_DEBUG.trace(" getObjectTime: " + ObjyObjectManager.getObjectTime / 1000000.0); // TRACER_DEBUG.trace(" updateObjectTime: " + ObjyObjectManager.updateObjectTime / 1000000.0); // TRACER_DEBUG.trace(" resourceCheckAndUpdateTime: " + ObjyObjectManager.resourceCheckAndUpdateTime / // 1000000.0); // ObjyObjectManager.getObjectTime = 0; // ObjyObjectManager.updateObjectTime = 0; // ObjyObjectManager.resourceCheckAndUpdateTime = 0; } } /** * return an ObjyObject that represent the CDOID base. */ public ObjyObject getObject(CDOID id) { ObjyObject objyObject = objySession.getObjectManager().getObject(id); // make sure we get the base one and not any cached version. return objyObject.getBaseObject(); } /***** * Use this code for heart beat. Async async = null; try { monitor.begin(getListMappings().size() + 1); async = * monitor.forkAsync(); reviseObject(accessor, id, timeStamp); } finally { async.stop(); monitor.done(); } [10:07:02 * AM] Eike Stepper: that one takes care that the heartbeat goes on [10:07:13 AM] Eike Stepper: for indefinite time */ private void writeRevision(InternalCDORevision revision, OMMonitor monitor) { Async async = null; try { monitor.begin(1000); // IS: experimental. async = monitor.forkAsync(); // EClass eClass = revision.getEClass(); long __start = System.nanoTime(); // ObjyObject objyObject = getObject(revision.getID()); ObjyObject objyObject = newObjyObjectsMap.get(revision.getID()); if (objyObject == null) { objyObject = getObject(revision.getID()); // we shouldn't need to come here. } ObjyObjectManager.getObjectTime += System.nanoTime() - __start; if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("Writing revision: {0} - OID: {1}", revision, objyObject.ooId().getStoreString()); //$NON-NLS-1$ } // System.out.println(">>>IS: Writing: " + revision.getID() + " - oid: " + objyObject.ooId().getStoreString()); // System.out.println("\t - version : " + revision.getVersion()); // System.out.println("\t - timestamp : " + revision.getTimeStamp()); // System.out.println("\t - revised : " + revision.getRevised()); // System.out.println("\t - resourceId : " + revision.getResourceID()); // System.out.println("\t - containerId: " + revision.getContainerID()); // System.out.println("\t - branch : " + revision.getBranch().toString()); // System.out.println("\t - revision : " + revision.toString()); ObjyObject newObjyRevision = objyObject; if (revision.getVersion() > CDOBranchVersion.FIRST_VERSION) // we're updating other versions... { // TRACER_DEBUG.format("...Updating other revisions using writeRevision()..."); ObjyObject oldObjyRevision = objyObject.getRevisionByVersion(revision.getVersion() - 1, revision.getBranch().getID(), objySession.getObjectManager()); if (oldObjyRevision == null) { new IllegalStateException("Revision with version: " + (revision.getVersion() - 1) + " is not in the store."); //$NON-NLS-1$ } if (getStore().isRequiredToSupportAudits()) { // if we allow versioning, then create a new one here. // IS: I'm not sure if we'll be called here we always go to the writeRevisionDelta call. newObjyRevision = objySession.getObjectManager().newObject(revision.getEClass(), oldObjyRevision.ooId()); objyObject.addToRevisions(newObjyRevision); } else { newObjyRevision = oldObjyRevision; } } if (getStore().isRequiredToSupportBranches()) { // add the newObjyRevision to the proper branch. ObjyBranch objyBranch = objySession.getBranchManager(getRepositoryName()).getBranch(revision.getBranch().getID()); ooObj anObj = ooObj.create_ooObj(newObjyRevision.ooId()); try { objyBranch.addRevision(anObj); } catch (LockNotGrantedException ex) { ex.printStackTrace(); } } __start = System.nanoTime(); newObjyRevision.update(this, revision); ObjyObjectManager.updateObjectTime += System.nanoTime() - __start; // if it's a resource, collect it. if (revision.isResourceNode()) { __start = System.nanoTime(); // TODO - this is temp solution to lock the common resource list // Add resource to the list ObjyResourceList resourceList = objySession.getResourceList(getRepositoryName()); ooObj anObj = (ooObj)objySession.getFD().objectFrom(resourceList.ooId()); SmartLock.lock(anObj.getContainer()); // before we update the data into the object we need to check // if it's a resource and we're trying to add a duplicate. // TODO - do we need to check for Folder and resouce, or is the isResourceNode() // check is enough?!!! if (revision.isResourceFolder() || revision.isResource()) { // this call will throw exception if we have a duplicate resource we trying to add. resourceList.checkDuplicateResources(this, revision); } SmartLock.lock(newObjyRevision); try { resourceList.add(newObjyRevision); } catch (LockNotGrantedException ex) { ex.printStackTrace(); } ObjyObjectManager.resourceCheckAndUpdateTime += System.nanoTime() - __start; } } finally { async.stop(); monitor.done(); } } @Override protected void doCommit(OMMonitor monitor) { // System.out.println(">>>>IS:<<< doCommit() " + this + " - objy session: " + objySession.toString()); long start = System.currentTimeMillis(); Async async = null; monitor.begin(); try { try { async = monitor.forkAsync(); // The commit request might come from a different thread. ensureSessionJoin(); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace("Committing ..." + objySession + " nc:" + objySession.nestCount()); } if (objySession.isOpen() == true) { objySession.commit(); } else { TRACER_DEBUG.trace("Error: calling objySession.commit() without having an open trx."); } if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace("Committed"); } } finally { if (async != null) { async.stop(); } } } catch (RuntimeException exception) { TRACER_INFO.trace(exception.getMessage(), exception); exception.printStackTrace(); throw exception; } finally { monitor.done(); } // 100920 - IS: for debugging if (TRACER_DEBUG.isEnabled()) { // TRACER_DEBUG.trace("doCommit() - new objects created: " + ObjyObjectManager.newObjCount + " - Internal: " // + ObjyObjectManager.newInternalObjCount); // ObjyObjectManager.newObjCount = 0; // ObjyObjectManager.newInternalObjCount = 0; TRACER_DEBUG.trace(" readRvisions: " + readRevisionCount + " - time: " + readRevisionTime / 1000000.0); TRACER_DEBUG.trace(" fetchCount: " + ObjyObject.fetchCount + " - updateCount: " + ObjyObject.updateCount); TRACER_DEBUG.trace("\t commit time: " + (System.currentTimeMillis() - start)); readRevisionTime = 0; readRevisionCount = 0; ObjyObject.fetchCount = 0; ObjyObject.updateCount = 0; } // System.out.println("IS:>>> ObjyObject.ctor(): count " + ObjyObject.count + " - totalTime: " + ObjyObject.tDiff); // for (ooId oid : ObjyObject.oids) // { // System.out.println("<" + oid.getStoreString() + "> "); // } // System.out.println(); // ObjyObject.count = 0; // ObjyObject.tDiff = 0; // ObjyObject.oids.clear(); } public IObjectivityStoreChunkReader createChunkReader(InternalCDORevision revision, EStructuralFeature feature) { return new ObjectivityStoreChunkReader(this, revision, feature); } public EPackage[] loadPackageUnit(InternalCDOPackageUnit packageUnit) { // using the packageUnit.getID() we'll read the object from the FD and get the bytes. byte[] bytes = null; ensureSessionBegin(); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("loadPackageUnit for: {0}", packageUnit.getID()); //$NON-NLS-1$ } ObjyPackageHandler objyPackageHandler = getStore().getPackageHandler(); bytes = objyPackageHandler.readPackageBytes(packageUnit); EPackage ePackage = createEPackage(packageUnit, bytes); return EMFUtil.getAllPackages(ePackage); } private EPackage createEPackage(InternalCDOPackageUnit packageUnit, byte[] bytes) { ResourceSet resourceSet = EMFUtil.newEcoreResourceSet(getPackageRegistry()); return EMFUtil.createEPackage(packageUnit.getID(), bytes, zipped, resourceSet, false); } private CDOPackageRegistry getPackageRegistry() { return getStore().getRepository().getPackageRegistry(); } /** * TODO - 1) make sure that we return the root resource when we asked for "null" pathPrefix. 2) Create the "null" * resource folder if it doesn't exist, perhaps when we initialize the store. */ public void queryResources(QueryResourcesContext context) { ensureSessionBegin(); String pathPrefix = context.getName(); boolean exactMatch = context.exactMatch(); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("queryResources() for : " + (pathPrefix == null ? "NULL" : pathPrefix) + " - exactMatch: " + exactMatch); } ObjyResourceList resourceList = objySession.getResourceList(getRepositoryName()); int size = resourceList.size(); if (size == 0) // nothing yet. { CDOID resourceID = OBJYCDOIDUtil.getCDOID(null); context.addResource(resourceID); } // TBD: We need to verify the folderID as well!! // CDOID folderID = org.eclipse.emf.cdo.common.id.CDOIDUtil.isNull(context.getFolderID()) ? null : context // .getFolderID(); for (int i = 0; i < size; i++) { ObjyObject resource = resourceList.getResource(i); if (resource != null) { ObjyObject resourceRevision = resource; // get the proper revision of the resource (might need to refactor this code, see readRevision()) if (getStore().isRequiredToSupportBranches()) { try { resourceRevision = resource.getRevision(context.getTimeStamp(), context.getBranch().getID(), objySession.getObjectManager()); } catch (RuntimeException ex) { ex.printStackTrace(); } } else if (getStore().isRequiredToSupportAudits()) { try { resourceRevision = resource.getRevision(context.getTimeStamp(), CDOBranch.MAIN_BRANCH_ID, objySession.getObjectManager()); } catch (RuntimeException ex) { ex.printStackTrace(); } } if (resourceRevision == null || resourceRevision.getVersion() < 0) { continue; } String resourceName = ObjyResourceList.getResourceName(resourceRevision); CDOID resourceID = OBJYCDOIDUtil.getCDOID(resource.ooId()); if (exactMatch && pathPrefix != null && pathPrefix.equals(resourceName) || pathPrefix == null && resourceName == null) { if (!context.addResource(resourceID)) { if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format(" queryResources(1.1) got: " + resource.ooId().getStoreString() + " - version: " + resource.getVersion()); } // No more results allowed break; // don't continue } } else if (!exactMatch && resourceName != null) { if (resourceName.startsWith(pathPrefix)) { context.addResource(resourceID); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format(" queryResources(1.2) got: " + resource.ooId().getStoreString() + " - version: " + resource.getVersion()); } } } /*** * TODO - verify if we need this code, originally from the old impl. CDOID lookupFolderID = (CDOID) * objectManager.getEContainer(resource); if (ObjectUtil.equals(lookupFolderID, folderID)) { boolean match = * exactMatch || pathPrefix == null; if (match) { CDOID resourceID = CDOIDUtil.getCDOID(resource.ooId()); if * (!context.addResource(resourceID)) { break; } } } ***/ } } } public void queryXRefs(QueryXRefsContext context) { ensureSessionBegin(); Set<CDOID> targetIDs = context.getTargetObjects().keySet(); Map<EClass, List<EReference>> sourceCandidates = context.getSourceCandidates(); // get the context branch. CDOBranch branch = context.getBranch(); ObjyBranchManager branchManager = objySession.getBranchManager(getRepositoryName()); ObjyBranch objyBranch = branchManager.getBranch(branch.getID()); // iterate over all revision in a branch. ObjyObject objyObject = null; SortedSet<?> revisions = objyBranch.getRevisions(); for (Object anObj : revisions) { // the ooObj we get from revisions is the correct one for that branch. objyObject = objySession.getObjectManager().getObject(((ooObj)anObj).getOid()); // InternalCDORevision revision = getRevision(list, context); // if (revision == null || revision instanceof SyntheticCDORevision) // { // continue; // } // EClass eClass = ObjySchema.getEClass(getStore(), objyObject.objyClass()); CDOID sourceID = objyObject.getRevisionId(); List<EReference> eReferences = sourceCandidates.get(eClass); if (eReferences != null) { for (EReference eReference : eReferences) { if (eReference.isMany()) { List<Object> results = objyObject.fetchList(this, eReference, 0, CDORevision.UNCHUNKED); if (results != null) { try { int index = 0; for (Object id : results) { if (!queryXRefs(context, targetIDs, (CDOID)id, sourceID, eReference, index++)) { return; } } } catch (Exception ex) { ex.printStackTrace(); } } } else { Object value = objyObject.get(eReference); CDOID id = (CDOID)value; if (!queryXRefs(context, targetIDs, id, sourceID, eReference, 0)) { return; } } } } } } private boolean queryXRefs(QueryXRefsContext context, Set<CDOID> targetIDs, CDOID targetID, CDOID sourceID, EReference sourceReference, int index) { for (CDOID id : targetIDs) { if (id.equals(targetID)) { if (!context.addXRef(targetID, sourceID, sourceReference, index)) { // No more results allowed return false; } } } return true; } /** * Read all package units from the store. It's the opposite of writePackageUnits */ public Collection<InternalCDOPackageUnit> readPackageUnits() { if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("readPackageUnits()"); //$NON-NLS-1$ } ensureSessionBegin(); ObjyPackageHandler objyPackageHandler = getStore().getPackageHandler(); Collection<InternalCDOPackageUnit> packageUnits = objyPackageHandler.readPackageUnits(); return packageUnits; } /** * */ public InternalCDORevision readRevision(CDOID id, CDOBranchPoint branchPoint, int listChunk, CDORevisionCacheAdder cache) { long __start = System.nanoTime(); ensureSessionBegin(); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("RR - Read rev for: {0}, TS:{1}", id, branchPoint.getTimeStamp()); //$NON-NLS-1$ } // we shouldn't be doing this!!! if (id instanceof CDOIDExternal) { // 100917 - IS: This must be a bug in CDO, it's throwing a CDOIDExternal at us // we'll return null. // TRACER_DEBUG.format("objy can't read revision for CDOID: {0}, it's external.", id.toString()); TRACER_DEBUG.trace("objy can't read revision for external CDOID: " + id.toString()); return null; } // we might have a proxy object!!!! ObjyObject objyObject = getObject(id); if (objyObject == null) { if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("RR - objyObject is NULL 4 ID:" + id); //$NON-NLS-1$ } return null; } // else // { // TRACER_DEBUG.format("RR - objyObject is ID:" + id + ", :" + objyObject.ooId().getStoreString()); //$NON-NLS-1$ // } InternalCDORevision revision = createRevision(objyObject, id); revision.setBranchPoint(branchPoint); ObjyObject objyRevision = objyObject; if (getStore().isRequiredToSupportBranches()) { try { objyRevision = objyObject.getRevision(branchPoint.getTimeStamp(), branchPoint.getBranch().getID(), objySession.getObjectManager()); if (objyRevision == null) { TRACER_DEBUG.format("RR - branches ID:{0}, OB:{1}, BPB:{2}, BPTS:{3}", id, objyObject.getBranchId(), //$NON-NLS-1$ branchPoint.getBranch().getID(), branchPoint.getTimeStamp()); } } catch (RuntimeException ex) { ex.printStackTrace(); } } else if (getStore().isRequiredToSupportAudits()) { try { objyRevision = objyObject.getRevision(branchPoint.getTimeStamp(), CDOBranch.MAIN_BRANCH_ID, objySession.getObjectManager()); if (objyRevision == null) { TRACER_DEBUG.format("RR - audit ID:{0}, OB:{1}, BPB:{2}, BPTS:{3}", id, objyObject.getBranchId(), //$NON-NLS-1$ branchPoint.getBranch().getID(), branchPoint.getTimeStamp()); } } catch (RuntimeException ex) { ex.printStackTrace(); } } if (objyRevision == null) { if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("RR - objyRevision is NULL 4 ID:" + id); //$NON-NLS-1$ } return null; } // check the version if (objyRevision.getVersion() < 0) { if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("RR - ...revision for: {0} - OID: {1} is detached.", id, //$NON-NLS-1$ objyObject.ooId().getStoreString()); } EClass eClass = ObjySchema.getEClass(getStore(), objyObject.objyClass()); return new DetachedCDORevision(eClass, id, branchPoint.getBranch(), -objyRevision.getVersion(), objyRevision.getCreationTime()); } CDOBranchPoint branchPoint2 = revision.getBranch().getPoint(objyRevision.getCreationTime()); revision.setBranchPoint(branchPoint2); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("RR - Fetching revision details for: {0} - OID:{1}", id, //$NON-NLS-1$ objyRevision.ooId().getStoreString()); } boolean ok = objyRevision.fetch(this, revision, listChunk); if (!ok) { TRACER_DEBUG.format("RR - Fetch rev failed 4: {0}, :{1}", id, objyRevision.ooId().getStoreString()); //$NON-NLS-1$ } readRevisionTime += System.nanoTime() - __start; readRevisionCount++; return ok ? revision : null; } /** * */ public InternalCDORevision readRevisionByVersion(CDOID id, CDOBranchVersion branchVersion, int listChunk, CDORevisionCacheAdder cache) { long __start = System.nanoTime(); ensureSessionBegin(); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("RRBV - Read rev 4: {0}, ver: {1}", id, branchVersion.getVersion()); //$NON-NLS-1$ } // we might have a proxy object!!!! ObjyObject objyObject = getObject(id); if (objyObject == null) { if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("RRBV - objyObject is NULL for ID: " + id); //$NON-NLS-1$ } return null; } // { // TRACER_DEBUG.format("RRBV - objyObject 4 ID: " + id + ", :" + objyObject.ooId().getStoreString()); //$NON-NLS-1$ // } ObjyObject objyRevision = null; objyRevision = objyObject.getRevisionByVersion(branchVersion.getVersion(), branchVersion.getBranch().getID(), objySession.getObjectManager()); // if (getStore().isRequiredToSupportAudits()) // { // objyRevision = objyObject.getRevisionByVersion(branchVersion.getVersion()); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("Reading revision by version {0} for: {1} - OID: {2}", branchVersion.getVersion(), id, //$NON-NLS-1$ objyObject.ooId().getStoreString()); } // } // else // { // objyRevision = objyObject.getLastRevision(); // // if (TRACER_DEBUG.isEnabled()) // { // TRACER_DEBUG.format( // "(None-Audit) Reading revision by version for: {0} - OID: {1}", id, objyObject.ooId().getStoreString()); // //$NON-NLS-1$ // } // } if (objyRevision == null) { if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("RRBV - objyRevision is NULL for ID: ", id); //$NON-NLS-1$ } return null; } InternalCDORevision revision = createRevision(objyRevision, id); revision.setVersion(branchVersion.getVersion()); revision.setBranchPoint(branchVersion.getBranch().getHead()); // TODO - clean up the following 3 lines... // InternalCDOBranchManager branchManager = getStore().getRepository().getBranchManager(); // CDOBranch mainBranch = branchManager.getBranch(CDOBranch.MAIN_BRANCH_ID); // //revision.setBranchPoint(CDOBranchUtil.createBranchPoint(mainBranch, 0)); // revision.setBranchPoint(mainBranch.getHead()); boolean ok = objyRevision.fetch(this, revision, listChunk); if (ok && objyRevision.getVersion() != branchVersion.getVersion()) { throw new IllegalStateException("Can only retrieve current version " + revision.getVersion() + " for " + //$NON-NLS-1$ //$NON-NLS-2$ id + " - version requested was " + branchVersion + "."); //$NON-NLS-1$ //$NON-NLS-2$ } // if (!ok) // { // TRACER_DEBUG.format("RRBV - Fetch rev failed 4: {0}, :", id, objyRevision.ooId().getStoreString()); //$NON-NLS-1$ // } readRevisionTime += System.nanoTime() - __start; readRevisionCount++; return ok ? revision : null; } public void writePackageUnits(InternalCDOPackageUnit[] packageUnits, OMMonitor monitor) { if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.format("writePackageUnits()"); //$NON-NLS-1$ } ensureSessionBegin(); ObjyPackageHandler objyPackageHandler = getStore().getPackageHandler(); CDOPackageRegistry packageRegistry = getStore().getRepository().getPackageRegistry(); for (InternalCDOPackageUnit packageUnit : packageUnits) { objyPackageHandler.writePackages(packageRegistry, packageUnit, monitor/* .fork() */); } } private InternalCDORevision createRevision(ObjyObject objyObject, CDOID id) { EClass eClass = ObjySchema.getEClass(getStore(), objyObject.objyClass()); if (eClass == null) { if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace("OBJY: Can't find eClass for id:" + id); } return null; } return getStore().createRevision(eClass, id); } private String getRepositoryName() { return getStore().getRepository().getName(); } /*** * For us, this function creates the skeleton objects in Objectivity, to be able to get the new ooId and pass it to * the commitContext. The objects data will be updated in the call to writeRevision(). */ @Override public void addIDMappings(InternalCommitContext commitContext, OMMonitor monitor) { long __start = System.nanoTime(); ensureSessionBegin(); if (commitContext.getNewObjects().length > 0) { if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace("creating " + commitContext.getNewObjects().length + " new objects and assigning new IDs"); } InternalCDORevision[] newObjects = commitContext.getNewObjects(); try { monitor.begin(newObjects.length); ObjyPlacementManagerLocal placementManager = new ObjyPlacementManagerLocal(getStore(), objySession, commitContext, newObjyObjectsMap); // iterate over the list and skip the ones we already have created. for (InternalCDORevision revision : newObjects) { try { placementManager.processRevision(revision); } catch (com.objy.db.ObjyRuntimeException ex) { System.out.println(">>>>IS: Exception<<<< Session: " + objySession + " open status: " + objySession.isOpen()); ex.printStackTrace(); } monitor.worked(); } } finally { monitor.done(); } } if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace(" addIDMappings for " + commitContext.getNewObjects().length + " - time: " + (System.nanoTime() - __start) / 1000000.0); TRACER_DEBUG.trace(" createObjects : " + ObjyObject.createObjectCount + " - time: " + ObjyObject.createObjectTime / 1000000.0); ObjyObject.createObjectTime = 0; ObjyObject.createObjectCount = 0; } } @Override protected CDOID getNextCDOID(CDORevision revision) { // Never called throw new UnsupportedOperationException(); } /*************************** * Local Utility functions. ***************************/ public void ensureActiveSession() { ensureSessionBegin(); } protected void ensureSessionBegin() { getObjySession(); if (!objySession.isJoined()) { objySession.join(); } if (!objySession.isOpen()) { if (isRead) { objySession.setOpenMode(oo.openReadOnly); } else { objySession.setOpenMode(oo.openReadWrite); } objySession.begin(); if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace( " ensureBeginSession() called begin() on session: " + objySession + " [name: " + objySession.getName() + " - open: " + objySession.isOpen() + "]"); } } } private void ensureSessionJoin() { // we better have a session for this store. assert objySession != null; // testSwitchViewTarget() is crashing because objySession is null. // TBD: verify this case!!! if (objySession != null && !objySession.isJoined()) { objySession.join(); } } // ********************************************* // New APIs for CDO 3.0 // ********************************************* public void loadCommitInfos(CDOBranch branch, long startTime, long endTime, CDOCommitInfoHandler handler) { ensureSessionBegin(); ObjyCommitInfoHandler commitInfoHandler = getStore().getCommitInfoHandler(); List<ObjyCommitInfo> commitInfoList = commitInfoHandler.getCommitInfo(branch, startTime, endTime); InternalSessionManager manager = getSession().getManager(); InternalRepository repository = manager.getRepository(); InternalCDOBranchManager branchManager = repository.getBranchManager(); InternalCDOCommitInfoManager commitInfoManager = repository.getCommitInfoManager(); for (ObjyCommitInfo ooCommitInfo : commitInfoList) { long timeStamp = ooCommitInfo.getTimeStamp(); long previousTimeStamp = ooCommitInfo.getPreviousTimeStamp(); String userID = ooCommitInfo.getUserId(); String comment = ooCommitInfo.getComment(); CDOBranch infoBranch = branch; if (infoBranch == null) { int id = ooCommitInfo.getBranchId(); infoBranch = branchManager.getBranch(id); } CDOCommitInfo commitInfo = commitInfoManager.createCommitInfo(infoBranch, timeStamp, previousTimeStamp, userID, comment, null, null); handler.handleCommitInfo(commitInfo); } } @SuppressWarnings("deprecation") @Override protected void writeCommitInfo(CDOBranch branch, long timeStamp, long previousTimeStamp, String userID, String comment, OMMonitor monitor) { ensureSessionBegin(); // we need to write the following... // ...branch.getID(), timeStamp, userID, comment. try { ObjyCommitInfoHandler commitInfoHandler = getStore().getCommitInfoHandler(); commitInfoHandler.writeCommitInfo(branch.getID(), timeStamp, previousTimeStamp, userID, comment); } catch (com.objy.db.ObjyRuntimeException ex) { ex.printStackTrace(); } } public IQueryHandler getQueryHandler(org.eclipse.emf.cdo.common.util.CDOQueryInfo info) { if (ObjectivityQueryHandler.QUERY_LANGUAGE.equals(info.getQueryLanguage())) { return new ObjectivityQueryHandler(this); } return null; } public Pair<Integer, Long> createBranch(int branchID, BranchInfo branchInfo) { ensureSessionBegin(); boolean convertToUpdate = false; // IS: this is a hack to overcome the issue in cdo core where the Accessor is requested for // read but it's trying to create stuff. if (isRead) { TRACER_DEBUG.trace("-->> createBranch() - Hack... Hack... changing read to update."); // upgrade the session to update. objySession.commit(); objySession.setOpenMode(oo.openReadWrite); convertToUpdate = true; objySession.begin(); } Pair<Integer, Long> retValue = objySession.getBranchManager(getRepositoryName()).createBranch(branchID, branchInfo); if (convertToUpdate) { // return the session to read. objySession.commit(); objySession.setOpenMode(oo.openReadOnly); objySession.begin(); } return retValue; } public BranchInfo loadBranch(int branchID) { ensureSessionBegin(); ObjyBranch objyBranch = objySession.getBranchManager(getRepositoryName()).getBranch(branchID); return objyBranch != null ? objyBranch.getBranchInfo() : null; } public int loadBranches(int startID, int endID, CDOBranchHandler branchHandler) { int count = 0; List<ObjyBranch> branches = objySession.getBranchManager(getRepositoryName()).getBranches(startID, endID); InternalCDOBranchManager branchManager = getStore().getRepository().getBranchManager(); for (ObjyBranch objyBranch : branches) { InternalCDOBranch branch = branchManager.getBranch(objyBranch.getBranchId(), new BranchInfo(objyBranch.getBranchName(), objyBranch.getBaseBranchId(), objyBranch.getBaseBranchTimeStamp())); branchHandler.handleBranch(branch); count++; } return count; } public SubBranchInfo[] loadSubBranches(int branchID) { ensureSessionBegin(); List<SubBranchInfo> result = new ArrayList<SubBranchInfo>(); List<ObjyBranch> objyBranchList = objySession.getBranchManager(getRepositoryName()).getSubBranches(branchID); for (ObjyBranch objyBranch : objyBranchList) { SubBranchInfo subBranchInfo = new SubBranchInfo(objyBranch.getBranchId(), objyBranch.getBranchName(), objyBranch.getBaseBranchTimeStamp()); result.add(subBranchInfo); } return result.toArray(new SubBranchInfo[result.size()]); } public void handleRevisions(EClass eClass, CDOBranch branch, long timeStamp, boolean exactTime, CDORevisionHandler handler) { ensureSessionBegin(); IRepository repository = getStore().getRepository(); CDORevisionManager revisionManager = repository.getRevisionManager(); CDOBranchManager branchManager = repository.getBranchManager(); // scan FD for ObjyBase which is the base class for all revisions Iterator<?> itr = objySession.getFD().scan(ObjyBase.CLASS_NAME); ObjyObject objyObject = null; while (itr.hasNext()) { objyObject = objySession.getObjectManager().getObject(((ooObj)itr).getOid()); if (!handleRevision(objyObject, eClass, branch, timeStamp, exactTime, handler, revisionManager, branchManager)) { return; } } // TODO: implement ObjectivityStoreAccessor.handleRevisions(eClass, branch, timeStamp, exactTime, handler) throw new UnsupportedOperationException(); } private boolean handleRevision(ObjyObject objyObject, EClass eClass, CDOBranch branch, long timeStamp, boolean exactTime, CDORevisionHandler handler, CDORevisionManager revisionManager, CDOBranchManager branchManager) { if (objyObject.getVersion() < 0) // DetachedCDORevision { return true; } if (eClass != null && ObjySchema.getEClass(getStore(), objyObject.objyClass()) != eClass) { return true; } if (branch != null && objyObject.getBranchId() != branch.getID()) { return true; } if (timeStamp != CDOBranchPoint.INVALID_DATE) { if (exactTime) { if (timeStamp != CDOBranchPoint.UNSPECIFIED_DATE && objyObject.getCreationTime() != timeStamp) { return true; } } else { long startTime = objyObject.getCreationTime(); long endTime = objyObject.getRevisedTime(); if (!CDOCommonUtil.isValidTimeStamp(timeStamp, startTime, endTime)) { return true; } } } CDOBranchVersion branchVersion = branchManager.getBranch((int)objyObject.getBranchId()).getVersion(Math.abs(objyObject.getVersion())); InternalCDORevision revision = (InternalCDORevision)revisionManager.getRevisionByVersion(OBJYCDOIDUtil.getCDOID(objyObject.ooId()), branchVersion, CDORevision.UNCHUNKED, true); return handler.handleRevision(revision); } public Set<CDOID> readChangeSet(OMMonitor monitor, CDOChangeSetSegment... segments) { monitor.begin(segments.length); try { ensureSessionBegin(); ObjyBranchManager objyBranchManager = objySession.getBranchManager(getRepositoryName()); ObjyObjectManager objyObjectManager = objySession.getObjectManager(); Set<CDOID> results = new HashSet<CDOID>(); // get all revisions that has branchId, and creation timestamp, and perhaps revised before // end timestamp or haven't been revised. for (CDOChangeSetSegment segment : segments) { ObjyBranch objyBranch = objyBranchManager.getBranch(segment.getBranch().getID()); // query the branch revisions for the time range. SortedSet<?> revisions = objyBranch.getRevisions(); readChangeSet(monitor.fork(), segment, objyObjectManager, revisions, results); } if (TRACER_DEBUG.isEnabled()) { TRACER_DEBUG.trace("ChangeSet " + results.toString()); } return results; } finally { monitor.done(); } } protected void readChangeSet(OMMonitor monitor, CDOChangeSetSegment segment, ObjyObjectManager objyObjectManager, SortedSet<?> revisions, Set<CDOID> results) { int size = revisions.size(); monitor.begin(size); Async async = null; try { async = monitor.forkAsync(); Iterator<?> objItr = revisions.iterator(); while (objItr.hasNext()) { ooObj anObj = (ooObj)objItr.next(); ObjyObject objyObject = objyObjectManager.getObject(anObj.getOid()); long creationTime = objyObject.getCreationTime(); long revisedTime = objyObject.getRevisedTime(); if (creationTime >= segment.getTimeStamp() && (revisedTime <= segment.getEndTime() || revisedTime == 0)) { results.add(objyObject.getRevisionId()); } monitor.worked(); } } finally { async.stop(); monitor.done(); } } public void queryLobs(List<byte[]> ids) { // TODO: implement ObjectivityStoreAccessor.queryLobs(ids) throw new UnsupportedOperationException(); } public void handleLobs(long fromTime, long toTime, CDOLobHandler handler) throws IOException { // TODO: implement ObjectivityStoreAccessor.handleLobs(fromTime, toTime, handler) throw new UnsupportedOperationException(); } public void loadLob(byte[] id, OutputStream out) throws IOException { // TODO: implement ObjectivityStoreAccessor.loadLob(id, out) throw new UnsupportedOperationException(); } @Override protected void writeBlob(byte[] id, long size, InputStream inputStream) throws IOException { // TODO: implement ObjectivityStoreAccessor.writeBlob(id, size, inputStream) throw new UnsupportedOperationException(); } @Override protected void writeClob(byte[] id, long size, Reader reader) throws IOException { // TODO: implement ObjectivityStoreAccessor.writeClob(id, size, reader) throw new UnsupportedOperationException(); } public void rawExport(CDODataOutput out, int fromBranchID, int toBranchID, long fromCommitTime, long toCommitTime) throws IOException { // TODO: implement ObjectivityStoreAccessor.rawExport(); throw new UnsupportedOperationException(); } public void rawImport(CDODataInput in, int fromBranchID, int toBranchID, long fromCommitTime, long toCommitTime, OMMonitor monitor) throws IOException { // TODO: implement ObjectivityStoreAccessor.rawImport throw new UnsupportedOperationException(); } public void rawStore(InternalCDOPackageUnit[] packageUnits, OMMonitor monitor) { // TODO: implement ObjectivityStoreAccessor.rawStore throw new UnsupportedOperationException(); } public void rawStore(InternalCDORevision revision, OMMonitor monitor) { // TODO: implement ObjectivityStoreAccessor.rawStore throw new UnsupportedOperationException(); } public void rawStore(byte[] id, long size, InputStream inputStream) throws IOException { // TODO: implement ObjectivityStoreAccessor.rawStore throw new UnsupportedOperationException(); } public void rawStore(byte[] id, long size, Reader reader) throws IOException { // TODO: implement ObjectivityStoreAccessor.rawStore throw new UnsupportedOperationException(); } public void rawStore(CDOBranch branch, long timeStamp, long previousTimeStamp, String userID, String comment, OMMonitor monitor) { // TODO: implement ObjectivityStoreAccessor.rawStore throw new UnsupportedOperationException(); } @Deprecated public void rawDelete(CDOID id, int version, CDOBranch branch, EClass eClass, OMMonitor monitor) { throw new UnsupportedOperationException(); } public void rawCommit(double commitWork, OMMonitor monitor) { // TODO: implement ObjectivityStoreAccessor.rawCommit throw new UnsupportedOperationException(); } public LockArea createLockArea(String userID, CDOBranchPoint branchPoint, boolean readOnly, Map<CDOID, LockGrade> locks) { // TODO: implement ObjectivityStoreAccessor.createLockArea throw new UnsupportedOperationException(); } public LockArea getLockArea(String durableLockingID) throws LockAreaNotFoundException { // TODO: implement ObjectivityStoreAccessor.getLockArea throw new UnsupportedOperationException(); } public void getLockAreas(String userIDPrefix, Handler handler) { ensureSessionBegin(); InternalCDOBranchManager branchManager = getStore().getRepository().getBranchManager(); ObjyLockAreaManager objyLockAreaManager = objySession.getLockAreaManager(getRepositoryName()); objyLockAreaManager.getLockAreas(branchManager, userIDPrefix, handler); } public void deleteLockArea(String durableLockingID) { // TODO: implement ObjectivityStoreAccessor.deleteLockArea throw new UnsupportedOperationException(); } public void lock(String durableLockingID, LockType type, Collection<? extends Object> objectsToLock) { // TODO: implement ObjectivityStoreAccessor.lock throw new UnsupportedOperationException(); } public void unlock(String durableLockingID, LockType type, Collection<? extends Object> objectsToUnlock) { // TODO: implement ObjectivityStoreAccessor.unlock throw new UnsupportedOperationException(); } public void unlock(String durableLockingID) { // TODO: implement ObjectivityStoreAccessor.unlock throw new UnsupportedOperationException(); } }