Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2012-05-26 08:07:59 +0000
committerEike Stepper2012-05-26 08:07:59 +0000
commita2eefe9b097fe2ac8e78c1d3eef1b0c2746e136d (patch)
treeb7d93a0fee618b794e159bc01cdfe98b627c63b7 /plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/RevisionInfo.java
parent3b2739c54db63f060472c2172f81312225220d9e (diff)
downloadcdo-a2eefe9b097fe2ac8e78c1d3eef1b0c2746e136d.tar.gz
cdo-a2eefe9b097fe2ac8e78c1d3eef1b0c2746e136d.tar.xz
cdo-a2eefe9b097fe2ac8e78c1d3eef1b0c2746e136d.zip
[380629] Design a default Security model
https://bugs.eclipse.org/bugs/show_bug.cgi?id=380629
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/RevisionInfo.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/RevisionInfo.java1187
1 files changed, 616 insertions, 571 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/RevisionInfo.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/RevisionInfo.java
index 71e6ea8153..60eb9512a9 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/RevisionInfo.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/RevisionInfo.java
@@ -1,571 +1,616 @@
-/*
- * Copyright (c) 2004 - 2012 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:
- * Eike Stepper - initial API and implementation
- */
-package org.eclipse.emf.cdo.spi.common.revision;
-
-import org.eclipse.emf.cdo.common.branch.CDOBranch;
-import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
-import org.eclipse.emf.cdo.common.branch.CDOBranchVersion;
-import org.eclipse.emf.cdo.common.id.CDOID;
-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.net4j.util.CheckUtil;
-import org.eclipse.net4j.util.ObjectUtil;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * @author Eike Stepper
- * @since 3.0
- */
-public abstract class RevisionInfo
-{
- private static final int NO_RESULT = 0;
-
- private static final int POINTER_RESULT = 1;
-
- private static final int DETACHED_RESULT = 2;
-
- private static final int NORMAL_RESULT = 3;
-
- private CDOID id;
-
- private CDOBranchPoint requestedBranchPoint;
-
- private InternalCDORevision result;
-
- private SyntheticCDORevision synthetic;
-
- protected RevisionInfo(CDOID id, CDOBranchPoint requestedBranchPoint)
- {
- CheckUtil.checkArg(requestedBranchPoint, "requestedBranchPoint");
- this.id = id;
- this.requestedBranchPoint = requestedBranchPoint;
- }
-
- protected RevisionInfo(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
- {
- CheckUtil.checkArg(requestedBranchPoint, "requestedBranchPoint");
- id = in.readCDOID();
- this.requestedBranchPoint = requestedBranchPoint;
- }
-
- public abstract Type getType();
-
- public final CDOID getID()
- {
- return id;
- }
-
- public final CDOBranchPoint getRequestedBranchPoint()
- {
- return requestedBranchPoint;
- }
-
- public InternalCDORevision getResult()
- {
- return result;
- }
-
- public void setResult(InternalCDORevision result)
- {
- this.result = result;
- }
-
- public SyntheticCDORevision getSynthetic()
- {
- return synthetic;
- }
-
- public void setSynthetic(SyntheticCDORevision synthetic)
- {
- this.synthetic = synthetic;
- }
-
- public abstract boolean isLoadNeeded();
-
- public void write(CDODataOutput out) throws IOException
- {
- out.writeByte(getType().ordinal());
- out.writeCDOID(getID());
- }
-
- public static RevisionInfo read(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
- {
- byte ordinal = in.readByte();
- Type type = Type.values()[ordinal];
- switch (type)
- {
- case AVAILABLE_NORMAL:
- return new Available.Normal(in, requestedBranchPoint);
-
- case AVAILABLE_POINTER:
- return new Available.Pointer(in, requestedBranchPoint);
-
- case AVAILABLE_DETACHED:
- return new Available.Detached(in, requestedBranchPoint);
-
- case MISSING:
- return new Missing(in, requestedBranchPoint);
-
- default:
- throw new IOException("Invalid revision info type: " + type);
- }
- }
-
- public void execute(InternalCDORevisionManager revisionManager, int referenceChunk)
- {
- SyntheticCDORevision[] synthetics = new SyntheticCDORevision[1];
- result = revisionManager.getRevision(getID(), requestedBranchPoint, referenceChunk, CDORevision.DEPTH_NONE, true,
- synthetics);
- synthetic = synthetics[0];
- }
-
- public void writeResult(CDODataOutput out, int referenceChunk) throws IOException
- {
- writeRevision(out, referenceChunk);
- writeResult(out, synthetic, referenceChunk);
- }
-
- public void readResult(CDODataInput in) throws IOException
- {
- readRevision(in);
- synthetic = (SyntheticCDORevision)readResult(in, getID(), requestedBranchPoint.getBranch());
- }
-
- public void processResult(InternalCDORevisionManager revisionManager, List<CDORevision> results,
- SyntheticCDORevision[] synthetics, int i)
- {
- if (result instanceof DetachedCDORevision)
- {
- results.add(null);
- }
- else
- {
- results.add(result);
- }
-
- if (result != null)
- {
- revisionManager.addRevision(result);
- }
-
- if (synthetic != null)
- {
- revisionManager.addRevision(synthetic);
- if (synthetic instanceof PointerCDORevision)
- {
- PointerCDORevision pointer = (PointerCDORevision)synthetic;
- CDOBranchVersion target = pointer.getTarget();
- if (target != result && target instanceof InternalCDORevision)
- {
- revisionManager.addRevision((CDORevision)target);
- }
- }
-
- if (synthetics != null)
- {
- synthetics[i] = synthetic;
- }
- }
- }
-
- protected void writeRevision(CDODataOutput out, int referenceChunk) throws IOException
- {
- out.writeCDORevision(result, referenceChunk);
- }
-
- protected void readRevision(CDODataInput in) throws IOException
- {
- result = (InternalCDORevision)in.readCDORevision();
- }
-
- /**
- * @since 4.0
- */
- public static void writeResult(CDODataOutput out, InternalCDORevision revision, int referenceChunk)
- throws IOException
- {
- if (revision == null)
- {
- out.writeByte(NO_RESULT);
- }
- else if (revision instanceof PointerCDORevision)
- {
- PointerCDORevision pointer = (PointerCDORevision)revision;
- out.writeByte(POINTER_RESULT);
- out.writeCDOClassifierRef(pointer.getEClass());
- out.writeLong(pointer.getRevised());
-
- CDOBranchVersion target = pointer.getTarget();
- if (target instanceof InternalCDORevision)
- {
- writeResult(out, (InternalCDORevision)target, referenceChunk);
- }
- else
- {
- out.writeByte(NO_RESULT);
- }
- }
- else if (revision instanceof DetachedCDORevision)
- {
- DetachedCDORevision detached = (DetachedCDORevision)revision;
- out.writeByte(DETACHED_RESULT);
- out.writeCDOClassifierRef(detached.getEClass());
- out.writeLong(detached.getTimeStamp());
- out.writeLong(detached.getRevised());
- out.writeInt(detached.getVersion());
- }
- else
- {
- out.writeByte(NORMAL_RESULT);
- out.writeCDORevision(revision, referenceChunk);
- }
- }
-
- /**
- * @since 4.0
- */
- public static InternalCDORevision readResult(CDODataInput in, CDOID id, CDOBranch branch) throws IOException
- {
- byte type = in.readByte();
- switch (type)
- {
- case NO_RESULT:
- return null;
-
- case POINTER_RESULT:
- {
- EClassifier classifier = in.readCDOClassifierRefAndResolve();
- long revised = in.readLong();
- InternalCDORevision target = readResult(in, id, branch);
- return new PointerCDORevision((EClass)classifier, id, branch, revised, target);
- }
-
- case DETACHED_RESULT:
- {
- EClassifier classifier = in.readCDOClassifierRefAndResolve();
- long timeStamp = in.readLong();
- long revised = in.readLong();
- int version = in.readInt();
- return new DetachedCDORevision((EClass)classifier, id, branch, version, timeStamp, revised);
- }
-
- case NORMAL_RESULT:
- return (InternalCDORevision)in.readCDORevision();
-
- default:
- throw new IllegalStateException("Invalid synthetic type: " + type);
- }
- }
-
- protected void doWriteResult(CDODataOutput out, InternalCDORevision revision, int referenceChunk) throws IOException
- {
- writeResult(out, revision, referenceChunk);
- }
-
- protected InternalCDORevision doReadResult(CDODataInput in) throws IOException
- {
- return readResult(in, id, requestedBranchPoint.getBranch());
- }
-
- /**
- * @author Eike Stepper
- * @since 3.0
- */
- public static enum Type
- {
- AVAILABLE_NORMAL, AVAILABLE_POINTER, AVAILABLE_DETACHED, MISSING
- }
-
- /**
- * @author Eike Stepper
- * @since 3.0
- */
- public static abstract class Available extends RevisionInfo
- {
- private CDOBranchVersion availableBranchVersion;
-
- protected Available(CDOID id, CDOBranchPoint requestedBranchPoint, CDOBranchVersion availableBranchVersion)
- {
- super(id, requestedBranchPoint);
- this.availableBranchVersion = availableBranchVersion;
- }
-
- protected Available(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
- {
- super(in, requestedBranchPoint);
- availableBranchVersion = in.readCDOBranchVersion();
- }
-
- public CDOBranchVersion getAvailableBranchVersion()
- {
- return availableBranchVersion;
- }
-
- public boolean isDirect()
- {
- return ObjectUtil.equals(availableBranchVersion.getBranch(), getRequestedBranchPoint().getBranch());
- }
-
- @Override
- public boolean isLoadNeeded()
- {
- return !isDirect();
- }
-
- @Override
- public void write(CDODataOutput out) throws IOException
- {
- super.write(out);
- out.writeCDOBranchVersion(availableBranchVersion);
- }
-
- @Override
- protected void writeRevision(CDODataOutput out, int referenceChunk) throws IOException
- {
- InternalCDORevision result = getResult();
- if (result != null && ObjectUtil.equals(result.getBranch(), availableBranchVersion.getBranch()))
- {
- // Use available
- out.writeBoolean(true);
- }
- else
- {
- out.writeBoolean(false);
- super.writeRevision(out, referenceChunk);
- }
- }
-
- @Override
- protected void readRevision(CDODataInput in) throws IOException
- {
- boolean useAvailable = in.readBoolean();
- if (useAvailable)
- {
- setResult((InternalCDORevision)availableBranchVersion);
- }
- else
- {
- super.readRevision(in);
- }
- }
-
- /**
- * @author Eike Stepper
- * @since 3.0
- */
- public static class Normal extends Available
- {
- public Normal(CDOID id, CDOBranchPoint requestedBranchPoint, CDOBranchVersion availableBranchVersion)
- {
- super(id, requestedBranchPoint, availableBranchVersion);
- }
-
- private Normal(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
- {
- super(in, requestedBranchPoint);
- }
-
- @Override
- public Type getType()
- {
- return Type.AVAILABLE_NORMAL;
- }
-
- @Override
- public InternalCDORevision getResult()
- {
- if (isDirect())
- {
- CDOBranchVersion branchVersion = getAvailableBranchVersion();
- if (branchVersion instanceof InternalCDORevision)
- {
- return (InternalCDORevision)branchVersion;
- }
- }
-
- return super.getResult();
- }
-
- @Override
- public void processResult(InternalCDORevisionManager revisionManager, List<CDORevision> results,
- SyntheticCDORevision[] synthetics, int i)
- {
- if (!isLoadNeeded())
- {
- setResult((InternalCDORevision)getAvailableBranchVersion());
- }
-
- super.processResult(revisionManager, results, synthetics, i);
- }
- }
-
- /**
- * @author Eike Stepper
- * @since 3.0
- */
- public static class Pointer extends Available
- {
- private CDOBranchVersion targetBranchVersion;
-
- private boolean hasTarget;
-
- public Pointer(CDOID id, CDOBranchPoint requestedBranchPoint, CDOBranchVersion availableBranchVersion,
- CDOBranchVersion targetBranchVersion)
- {
- super(id, requestedBranchPoint, availableBranchVersion);
- this.targetBranchVersion = targetBranchVersion;
- hasTarget = targetBranchVersion instanceof InternalCDORevision;
- }
-
- private Pointer(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
- {
- super(in, requestedBranchPoint);
- if (in.readBoolean())
- {
- targetBranchVersion = in.readCDOBranchVersion();
- hasTarget = in.readBoolean();
- }
- }
-
- public CDOBranchVersion getTargetBranchVersion()
- {
- return targetBranchVersion;
- }
-
- @Override
- public Type getType()
- {
- return Type.AVAILABLE_POINTER;
- }
-
- public boolean hasTarget()
- {
- return hasTarget;
- }
-
- @Override
- public boolean isLoadNeeded()
- {
- if (getRequestedBranchPoint().getBranch().isMainBranch())
- {
- return false;
- }
-
- return !isDirect() || !hasTarget();
- }
-
- @Override
- public void write(CDODataOutput out) throws IOException
- {
- super.write(out);
- if (targetBranchVersion != null)
- {
- out.writeBoolean(true);
- out.writeCDOBranchVersion(targetBranchVersion);
- out.writeBoolean(hasTarget);
- }
- else
- {
- out.writeBoolean(false);
- }
- }
-
- @Override
- public void processResult(InternalCDORevisionManager revisionManager, List<CDORevision> results,
- SyntheticCDORevision[] synthetics, int i)
- {
- if (!isLoadNeeded())
- {
- CDOBranchVersion target = getTargetBranchVersion();
- if (target instanceof InternalCDORevision)
- {
- setResult((InternalCDORevision)target);
- }
-
- setSynthetic((PointerCDORevision)getAvailableBranchVersion());
- }
-
- super.processResult(revisionManager, results, synthetics, i);
- }
- }
-
- /**
- * @author Eike Stepper
- * @since 3.0
- */
- public static class Detached extends Available
- {
- public Detached(CDOID id, CDOBranchPoint requestedBranchPoint, CDOBranchVersion availableBranchVersion)
- {
- super(id, requestedBranchPoint, availableBranchVersion);
- }
-
- private Detached(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
- {
- super(in, requestedBranchPoint);
- }
-
- @Override
- public Type getType()
- {
- return Type.AVAILABLE_DETACHED;
- }
-
- @Override
- public void processResult(InternalCDORevisionManager revisionManager, List<CDORevision> results,
- SyntheticCDORevision[] synthetics, int i)
- {
- if (!isLoadNeeded())
- {
- setSynthetic((DetachedCDORevision)getAvailableBranchVersion());
- }
-
- super.processResult(revisionManager, results, synthetics, i);
- }
- }
- }
-
- /**
- * @author Eike Stepper
- * @since 3.0
- */
- public static class Missing extends RevisionInfo
- {
- public Missing(CDOID id, CDOBranchPoint requestedBranchPoint)
- {
- super(id, requestedBranchPoint);
- }
-
- private Missing(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
- {
- super(in, requestedBranchPoint);
- }
-
- @Override
- public Type getType()
- {
- return Type.MISSING;
- }
-
- @Override
- public boolean isLoadNeeded()
- {
- return true;
- }
- }
-}
+/*
+ * Copyright (c) 2004 - 2012 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:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.spi.common.revision;
+
+import org.eclipse.emf.cdo.common.branch.CDOBranch;
+import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
+import org.eclipse.emf.cdo.common.branch.CDOBranchVersion;
+import org.eclipse.emf.cdo.common.id.CDOID;
+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.net4j.util.CheckUtil;
+import org.eclipse.net4j.util.ObjectUtil;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author Eike Stepper
+ * @since 3.0
+ */
+public abstract class RevisionInfo
+{
+ private static final int NO_RESULT = 0;
+
+ private static final int POINTER_RESULT = 1;
+
+ private static final int DETACHED_RESULT = 2;
+
+ private static final int NORMAL_RESULT = 3;
+
+ private CDOID id;
+
+ private CDOBranchPoint requestedBranchPoint;
+
+ private InternalCDORevision result;
+
+ private SyntheticCDORevision synthetic;
+
+ protected RevisionInfo(CDOID id, CDOBranchPoint requestedBranchPoint)
+ {
+ CheckUtil.checkArg(requestedBranchPoint, "requestedBranchPoint");
+ this.id = id;
+ this.requestedBranchPoint = requestedBranchPoint;
+ }
+
+ protected RevisionInfo(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
+ {
+ CheckUtil.checkArg(requestedBranchPoint, "requestedBranchPoint");
+ id = in.readCDOID();
+ this.requestedBranchPoint = requestedBranchPoint;
+ }
+
+ public abstract Type getType();
+
+ public final CDOID getID()
+ {
+ return id;
+ }
+
+ public final CDOBranchPoint getRequestedBranchPoint()
+ {
+ return requestedBranchPoint;
+ }
+
+ public InternalCDORevision getResult()
+ {
+ return result;
+ }
+
+ public void setResult(InternalCDORevision result)
+ {
+ this.result = result;
+ }
+
+ public SyntheticCDORevision getSynthetic()
+ {
+ return synthetic;
+ }
+
+ public void setSynthetic(SyntheticCDORevision synthetic)
+ {
+ this.synthetic = synthetic;
+ }
+
+ public abstract boolean isLoadNeeded();
+
+ public void write(CDODataOutput out) throws IOException
+ {
+ out.writeByte(getType().ordinal());
+ out.writeCDOID(getID());
+ }
+
+ public static RevisionInfo read(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
+ {
+ byte ordinal = in.readByte();
+ Type type = Type.values()[ordinal];
+ switch (type)
+ {
+ case AVAILABLE_NORMAL:
+ return new Available.Normal(in, requestedBranchPoint);
+
+ case AVAILABLE_POINTER:
+ return new Available.Pointer(in, requestedBranchPoint);
+
+ case AVAILABLE_DETACHED:
+ return new Available.Detached(in, requestedBranchPoint);
+
+ case MISSING:
+ return new Missing(in, requestedBranchPoint);
+
+ default:
+ throw new IOException("Invalid revision info type: " + type);
+ }
+ }
+
+ public void execute(InternalCDORevisionManager revisionManager, int referenceChunk)
+ {
+ SyntheticCDORevision[] synthetics = new SyntheticCDORevision[1];
+ result = revisionManager.getRevision(getID(), requestedBranchPoint, referenceChunk, CDORevision.DEPTH_NONE, true,
+ synthetics);
+ synthetic = synthetics[0];
+ }
+
+ /**
+ * @deprecated Not called anymore by the framework
+ */
+ @Deprecated
+ public void writeResult(CDODataOutput out, int referenceChunk) throws IOException
+ {
+ writeResult(out, referenceChunk, null);
+ }
+
+ /**
+ * @since 4.1
+ */
+ public void writeResult(CDODataOutput out, int referenceChunk, CDOBranchPoint securityContext) throws IOException
+ {
+ writeRevision(out, referenceChunk, securityContext);
+ writeResult(out, synthetic, referenceChunk, securityContext);
+ }
+
+ public void readResult(CDODataInput in) throws IOException
+ {
+ readRevision(in);
+ synthetic = (SyntheticCDORevision)readResult(in, getID(), requestedBranchPoint.getBranch());
+ }
+
+ public void processResult(InternalCDORevisionManager revisionManager, List<CDORevision> results,
+ SyntheticCDORevision[] synthetics, int i)
+ {
+ if (result instanceof DetachedCDORevision)
+ {
+ results.add(null);
+ }
+ else
+ {
+ results.add(result);
+ }
+
+ if (result != null)
+ {
+ revisionManager.addRevision(result);
+ }
+
+ if (synthetic != null)
+ {
+ revisionManager.addRevision(synthetic);
+ if (synthetic instanceof PointerCDORevision)
+ {
+ PointerCDORevision pointer = (PointerCDORevision)synthetic;
+ CDOBranchVersion target = pointer.getTarget();
+ if (target != result && target instanceof InternalCDORevision)
+ {
+ revisionManager.addRevision((CDORevision)target);
+ }
+ }
+
+ if (synthetics != null)
+ {
+ synthetics[i] = synthetic;
+ }
+ }
+ }
+
+ /**
+ * @deprecated Not called anymore by the framework
+ */
+ @Deprecated
+ protected void writeRevision(CDODataOutput out, int referenceChunk) throws IOException
+ {
+ writeRevision(out, referenceChunk, null);
+ }
+
+ /**
+ * @since 4.1
+ */
+ protected void writeRevision(CDODataOutput out, int referenceChunk, CDOBranchPoint securityContext)
+ throws IOException
+ {
+ out.writeCDORevision(result, referenceChunk, securityContext);
+ }
+
+ protected void readRevision(CDODataInput in) throws IOException
+ {
+ result = (InternalCDORevision)in.readCDORevision();
+ }
+
+ /**
+ * @since 4.0
+ * @deprecated Call {@link #writeResult(CDODataOutput, InternalCDORevision, int, CDOBranchPoint)}
+ */
+ @Deprecated
+ public static void writeResult(CDODataOutput out, InternalCDORevision revision, int referenceChunk)
+ throws IOException
+ {
+ writeResult(out, revision, referenceChunk, null);
+ }
+
+ /**
+ * @since 4.1
+ */
+ public static void writeResult(CDODataOutput out, InternalCDORevision revision, int referenceChunk,
+ CDOBranchPoint securityContext) throws IOException
+ {
+ if (revision == null)
+ {
+ out.writeByte(NO_RESULT);
+ }
+ else if (revision instanceof PointerCDORevision)
+ {
+ PointerCDORevision pointer = (PointerCDORevision)revision;
+ out.writeByte(POINTER_RESULT);
+ out.writeCDOClassifierRef(pointer.getEClass());
+ out.writeLong(pointer.getRevised());
+
+ CDOBranchVersion target = pointer.getTarget();
+ if (target instanceof InternalCDORevision)
+ {
+ writeResult(out, (InternalCDORevision)target, referenceChunk, securityContext);
+ }
+ else
+ {
+ out.writeByte(NO_RESULT);
+ }
+ }
+ else if (revision instanceof DetachedCDORevision)
+ {
+ DetachedCDORevision detached = (DetachedCDORevision)revision;
+ out.writeByte(DETACHED_RESULT);
+ out.writeCDOClassifierRef(detached.getEClass());
+ out.writeLong(detached.getTimeStamp());
+ out.writeLong(detached.getRevised());
+ out.writeInt(detached.getVersion());
+ }
+ else
+ {
+ out.writeByte(NORMAL_RESULT);
+ out.writeCDORevision(revision, referenceChunk, securityContext);
+ }
+ }
+
+ /**
+ * @since 4.0
+ */
+ public static InternalCDORevision readResult(CDODataInput in, CDOID id, CDOBranch branch) throws IOException
+ {
+ byte type = in.readByte();
+ switch (type)
+ {
+ case NO_RESULT:
+ return null;
+
+ case POINTER_RESULT:
+ {
+ EClassifier classifier = in.readCDOClassifierRefAndResolve();
+ long revised = in.readLong();
+ InternalCDORevision target = readResult(in, id, branch);
+ return new PointerCDORevision((EClass)classifier, id, branch, revised, target);
+ }
+
+ case DETACHED_RESULT:
+ {
+ EClassifier classifier = in.readCDOClassifierRefAndResolve();
+ long timeStamp = in.readLong();
+ long revised = in.readLong();
+ int version = in.readInt();
+ return new DetachedCDORevision((EClass)classifier, id, branch, version, timeStamp, revised);
+ }
+
+ case NORMAL_RESULT:
+ return (InternalCDORevision)in.readCDORevision();
+
+ default:
+ throw new IllegalStateException("Invalid synthetic type: " + type);
+ }
+ }
+
+ /**
+ * @deprecated Not called anymore by the framework
+ */
+ @Deprecated
+ protected void doWriteResult(CDODataOutput out, InternalCDORevision revision, int referenceChunk) throws IOException
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * @deprecated Not called anymore by the framework
+ */
+ @Deprecated
+ protected InternalCDORevision doReadResult(CDODataInput in) throws IOException
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * @author Eike Stepper
+ * @since 3.0
+ */
+ public static enum Type
+ {
+ AVAILABLE_NORMAL, AVAILABLE_POINTER, AVAILABLE_DETACHED, MISSING
+ }
+
+ /**
+ * @author Eike Stepper
+ * @since 3.0
+ */
+ public static abstract class Available extends RevisionInfo
+ {
+ private CDOBranchVersion availableBranchVersion;
+
+ protected Available(CDOID id, CDOBranchPoint requestedBranchPoint, CDOBranchVersion availableBranchVersion)
+ {
+ super(id, requestedBranchPoint);
+ this.availableBranchVersion = availableBranchVersion;
+ }
+
+ protected Available(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
+ {
+ super(in, requestedBranchPoint);
+ availableBranchVersion = in.readCDOBranchVersion();
+ }
+
+ public CDOBranchVersion getAvailableBranchVersion()
+ {
+ return availableBranchVersion;
+ }
+
+ public boolean isDirect()
+ {
+ return ObjectUtil.equals(availableBranchVersion.getBranch(), getRequestedBranchPoint().getBranch());
+ }
+
+ @Override
+ public boolean isLoadNeeded()
+ {
+ return !isDirect();
+ }
+
+ @Override
+ public void write(CDODataOutput out) throws IOException
+ {
+ super.write(out);
+ out.writeCDOBranchVersion(availableBranchVersion);
+ }
+
+ @Override
+ protected void writeRevision(CDODataOutput out, int referenceChunk, CDOBranchPoint securityContext)
+ throws IOException
+ {
+ InternalCDORevision result = getResult();
+ if (result != null && ObjectUtil.equals(result.getBranch(), availableBranchVersion.getBranch()))
+ {
+ // Use available
+ out.writeBoolean(true);
+ }
+ else
+ {
+ out.writeBoolean(false);
+ super.writeRevision(out, referenceChunk, securityContext);
+ }
+ }
+
+ @Override
+ protected void readRevision(CDODataInput in) throws IOException
+ {
+ boolean useAvailable = in.readBoolean();
+ if (useAvailable)
+ {
+ setResult((InternalCDORevision)availableBranchVersion);
+ }
+ else
+ {
+ super.readRevision(in);
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ * @since 3.0
+ */
+ public static class Normal extends Available
+ {
+ public Normal(CDOID id, CDOBranchPoint requestedBranchPoint, CDOBranchVersion availableBranchVersion)
+ {
+ super(id, requestedBranchPoint, availableBranchVersion);
+ }
+
+ private Normal(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
+ {
+ super(in, requestedBranchPoint);
+ }
+
+ @Override
+ public Type getType()
+ {
+ return Type.AVAILABLE_NORMAL;
+ }
+
+ @Override
+ public InternalCDORevision getResult()
+ {
+ if (isDirect())
+ {
+ CDOBranchVersion branchVersion = getAvailableBranchVersion();
+ if (branchVersion instanceof InternalCDORevision)
+ {
+ return (InternalCDORevision)branchVersion;
+ }
+ }
+
+ return super.getResult();
+ }
+
+ @Override
+ public void processResult(InternalCDORevisionManager revisionManager, List<CDORevision> results,
+ SyntheticCDORevision[] synthetics, int i)
+ {
+ if (!isLoadNeeded())
+ {
+ setResult((InternalCDORevision)getAvailableBranchVersion());
+ }
+
+ super.processResult(revisionManager, results, synthetics, i);
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ * @since 3.0
+ */
+ public static class Pointer extends Available
+ {
+ private CDOBranchVersion targetBranchVersion;
+
+ private boolean hasTarget;
+
+ public Pointer(CDOID id, CDOBranchPoint requestedBranchPoint, CDOBranchVersion availableBranchVersion,
+ CDOBranchVersion targetBranchVersion)
+ {
+ super(id, requestedBranchPoint, availableBranchVersion);
+ this.targetBranchVersion = targetBranchVersion;
+ hasTarget = targetBranchVersion instanceof InternalCDORevision;
+ }
+
+ private Pointer(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
+ {
+ super(in, requestedBranchPoint);
+ if (in.readBoolean())
+ {
+ targetBranchVersion = in.readCDOBranchVersion();
+ hasTarget = in.readBoolean();
+ }
+ }
+
+ public CDOBranchVersion getTargetBranchVersion()
+ {
+ return targetBranchVersion;
+ }
+
+ @Override
+ public Type getType()
+ {
+ return Type.AVAILABLE_POINTER;
+ }
+
+ public boolean hasTarget()
+ {
+ return hasTarget;
+ }
+
+ @Override
+ public boolean isLoadNeeded()
+ {
+ if (getRequestedBranchPoint().getBranch().isMainBranch())
+ {
+ return false;
+ }
+
+ return !isDirect() || !hasTarget();
+ }
+
+ @Override
+ public void write(CDODataOutput out) throws IOException
+ {
+ super.write(out);
+ if (targetBranchVersion != null)
+ {
+ out.writeBoolean(true);
+ out.writeCDOBranchVersion(targetBranchVersion);
+ out.writeBoolean(hasTarget);
+ }
+ else
+ {
+ out.writeBoolean(false);
+ }
+ }
+
+ @Override
+ public void processResult(InternalCDORevisionManager revisionManager, List<CDORevision> results,
+ SyntheticCDORevision[] synthetics, int i)
+ {
+ if (!isLoadNeeded())
+ {
+ CDOBranchVersion target = getTargetBranchVersion();
+ if (target instanceof InternalCDORevision)
+ {
+ setResult((InternalCDORevision)target);
+ }
+
+ setSynthetic((PointerCDORevision)getAvailableBranchVersion());
+ }
+
+ super.processResult(revisionManager, results, synthetics, i);
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ * @since 3.0
+ */
+ public static class Detached extends Available
+ {
+ public Detached(CDOID id, CDOBranchPoint requestedBranchPoint, CDOBranchVersion availableBranchVersion)
+ {
+ super(id, requestedBranchPoint, availableBranchVersion);
+ }
+
+ private Detached(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
+ {
+ super(in, requestedBranchPoint);
+ }
+
+ @Override
+ public Type getType()
+ {
+ return Type.AVAILABLE_DETACHED;
+ }
+
+ @Override
+ public void processResult(InternalCDORevisionManager revisionManager, List<CDORevision> results,
+ SyntheticCDORevision[] synthetics, int i)
+ {
+ if (!isLoadNeeded())
+ {
+ setSynthetic((DetachedCDORevision)getAvailableBranchVersion());
+ }
+
+ super.processResult(revisionManager, results, synthetics, i);
+ }
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ * @since 3.0
+ */
+ public static class Missing extends RevisionInfo
+ {
+ public Missing(CDOID id, CDOBranchPoint requestedBranchPoint)
+ {
+ super(id, requestedBranchPoint);
+ }
+
+ private Missing(CDODataInput in, CDOBranchPoint requestedBranchPoint) throws IOException
+ {
+ super(in, requestedBranchPoint);
+ }
+
+ @Override
+ public Type getType()
+ {
+ return Type.MISSING;
+ }
+
+ @Override
+ public boolean isLoadNeeded()
+ {
+ return true;
+ }
+ }
+}

Back to the top