| /* |
| * Copyright (c) 2010-2013, 2015, 2016 Eike Stepper (Loehne, 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(); |
| } |
| } |