diff options
19 files changed, 801 insertions, 612 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevision.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevision.java index 824c5cda9f..010eafaf2f 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevision.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevision.java @@ -66,4 +66,9 @@ public interface CDORevision public CDORevisionDelta compare(CDORevision origin); public void merge(CDORevisionDelta delta); + + /** + * @since 2.0 + */ + public CDORevision copy(); } diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionFactory.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionFactory.java new file mode 100644 index 0000000000..27b9bf2b05 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionFactory.java @@ -0,0 +1,28 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2008 Eike Stepper, Germany. + * 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.common.revision; + +import org.eclipse.emf.cdo.common.CDODataInput; +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.model.CDOClass; + +import java.io.IOException; + +/** + * @author Eike Stepper + * @since 2.0 + */ +public interface CDORevisionFactory +{ + public CDORevision createRevision(CDOClass cdoClass, CDOID id); + + public CDORevision createRevision(CDODataInput in) throws IOException; +} diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionUtil.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionUtil.java index 320df8e5b1..8df653e4f6 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionUtil.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionUtil.java @@ -10,6 +10,7 @@ **************************************************************************/ package org.eclipse.emf.cdo.common.revision; +import org.eclipse.emf.cdo.common.CDODataInput; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDTemp; import org.eclipse.emf.cdo.common.model.CDOClass; @@ -17,6 +18,7 @@ import org.eclipse.emf.cdo.common.model.core.CDOFeatureMapEntryDataType; import org.eclipse.emf.cdo.internal.common.model.core.CDOFeatureMapEntryDataTypeImpl; import org.eclipse.emf.cdo.internal.common.revision.CDORevisionImpl; +import java.io.IOException; import java.util.Map; /** @@ -41,14 +43,17 @@ public final class CDORevisionUtil /** * @since 2.0 */ - public static CDOFeatureMapEntryDataType createFeatureMapEntry(String uri, Object value) + public static CDORevision read(CDODataInput in) throws IOException { - return new CDOFeatureMapEntryDataTypeImpl(uri, value); + return new CDORevisionImpl(in); } - public static CDORevision copy(CDORevision source) + /** + * @since 2.0 + */ + public static CDOFeatureMapEntryDataType createFeatureMapEntry(String uri, Object value) { - return new CDORevisionImpl((CDORevisionImpl)source); + return new CDOFeatureMapEntryDataTypeImpl(uri, value); } public static Object remapID(Object value, Map<CDOIDTemp, CDOID> idMappings) diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/CDODataInputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/CDODataInputImpl.java index 7c638429d0..664a2f2800 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/CDODataInputImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/CDODataInputImpl.java @@ -30,6 +30,7 @@ import org.eclipse.emf.cdo.common.revision.CDOList; import org.eclipse.emf.cdo.common.revision.CDOListFactory; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionResolver; +import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.internal.common.bundle.OM; @@ -44,7 +45,6 @@ import org.eclipse.emf.cdo.internal.common.model.CDOClassImpl; import org.eclipse.emf.cdo.internal.common.model.CDOClassRefImpl; import org.eclipse.emf.cdo.internal.common.model.CDOFeatureImpl; import org.eclipse.emf.cdo.internal.common.model.CDOPackageImpl; -import org.eclipse.emf.cdo.internal.common.revision.CDORevisionImpl; import org.eclipse.emf.cdo.internal.common.revision.delta.CDOAddFeatureDeltaImpl; import org.eclipse.emf.cdo.internal.common.revision.delta.CDOClearFeatureDeltaImpl; import org.eclipse.emf.cdo.internal.common.revision.delta.CDOContainerFeatureDeltaImpl; @@ -306,7 +306,7 @@ public abstract class CDODataInputImpl implements CDODataInput boolean notNull = readBoolean(); if (notNull) { - return new CDORevisionImpl(this); + return readCDORevisionData(); } return null; @@ -413,6 +413,11 @@ public abstract class CDODataInputImpl implements CDODataInput return readBoolean() ? RWLockManager.LockType.WRITE : RWLockManager.LockType.READ; } + protected CDORevision readCDORevisionData() throws IOException + { + return CDORevisionUtil.read(this); + } + protected abstract CDOPackageManager getPackageManager(); protected abstract CDOPackageURICompressor getPackageURICompressor(); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/CDODataOutputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/CDODataOutputImpl.java index a183be4dd6..ad5d5a89ea 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/CDODataOutputImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/CDODataOutputImpl.java @@ -30,13 +30,13 @@ import org.eclipse.emf.cdo.internal.common.bundle.OM; import org.eclipse.emf.cdo.internal.common.id.CDOIDAndVersionImpl; import org.eclipse.emf.cdo.internal.common.model.CDOClassRefImpl; import org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl; -import org.eclipse.emf.cdo.internal.common.revision.CDORevisionImpl; import org.eclipse.emf.cdo.internal.common.revision.delta.CDOFeatureDeltaImpl; import org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionDeltaImpl; import org.eclipse.emf.cdo.spi.common.AbstractCDOID; import org.eclipse.emf.cdo.spi.common.InternalCDOClass; import org.eclipse.emf.cdo.spi.common.InternalCDOFeature; import org.eclipse.emf.cdo.spi.common.InternalCDOPackage; +import org.eclipse.emf.cdo.spi.common.InternalCDORevision; import org.eclipse.net4j.util.concurrent.RWLockManager; import org.eclipse.net4j.util.io.ExtendedDataOutput; @@ -243,7 +243,7 @@ public abstract class CDODataOutputImpl implements CDODataOutput if (revision != null) { writeBoolean(true); - ((CDORevisionImpl)revision).write(this, referenceChunk); + ((InternalCDORevision)revision).write(this, referenceChunk); } else { diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionImpl.java index 906af08de3..d8fab97c24 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionImpl.java @@ -14,635 +14,77 @@ package org.eclipse.emf.cdo.internal.common.revision; import org.eclipse.emf.cdo.common.CDODataInput; -import org.eclipse.emf.cdo.common.CDODataOutput; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDTemp; -import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOClass; -import org.eclipse.emf.cdo.common.model.CDOClassRef; import org.eclipse.emf.cdo.common.model.CDOFeature; import org.eclipse.emf.cdo.common.model.CDOType; -import org.eclipse.emf.cdo.common.revision.CDOList; -import org.eclipse.emf.cdo.common.revision.CDOListFactory; -import org.eclipse.emf.cdo.common.revision.CDOReferenceAdjuster; import org.eclipse.emf.cdo.common.revision.CDORevision; -import org.eclipse.emf.cdo.common.revision.CDORevisionData; -import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; -import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDeltaUtil; -import org.eclipse.emf.cdo.internal.common.bundle.OM; -import org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionMerger; +import org.eclipse.emf.cdo.spi.common.AbstractCDORevision; import org.eclipse.emf.cdo.spi.common.InternalCDOList; -import org.eclipse.emf.cdo.spi.common.InternalCDORevision; -import org.eclipse.emf.cdo.spi.common.InternalCDORevisionDelta; - -import org.eclipse.net4j.util.ImplementationError; -import org.eclipse.net4j.util.collection.MoveableList; -import org.eclipse.net4j.util.om.trace.ContextTracer; -import org.eclipse.net4j.util.om.trace.PerfTracer; import java.io.IOException; -import java.util.Map; /** * @author Eike Stepper */ -public class CDORevisionImpl implements InternalCDORevision +public class CDORevisionImpl extends AbstractCDORevision { - private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_REVISION, CDORevisionImpl.class); - - private static final PerfTracer READING = new PerfTracer(OM.PERF_REVISION_READING, CDORevisionImpl.class); - - private static final PerfTracer WRITING = new PerfTracer(OM.PERF_REVISION_WRITING, CDORevisionImpl.class); - - private CDOClass cdoClass; - - private CDOID id; - - private int version; - - private long created; - - private long revised; - - private CDOID resourceID; - - private Object containerID; - - private int containingFeatureID; - private Object[] values; public CDORevisionImpl(CDOClass cdoClass, CDOID id) { - if (cdoClass.isAbstract()) - { - throw new IllegalArgumentException("CDOClass is abstract: " + cdoClass); - } - - if (CDOIDUtil.isNull(id)) - { - throw new IllegalArgumentException("CDIID is null"); - } - - this.cdoClass = cdoClass; - this.id = id; - version = 0; - created = UNSPECIFIED_DATE; - revised = UNSPECIFIED_DATE; - resourceID = CDOID.NULL; - containerID = CDOID.NULL; - containingFeatureID = 0; - values = new Object[cdoClass.getAllFeatures().length]; - } - - public CDORevisionImpl(CDORevisionImpl source) - { - cdoClass = source.cdoClass; - id = source.id; - version = source.version; - created = source.created; - revised = source.revised; // == UNSPECIFIED - resourceID = source.resourceID; - containerID = source.containerID; - containingFeatureID = source.containingFeatureID; - copyValues(source.values); + super(cdoClass, id); } public CDORevisionImpl(CDODataInput in) throws IOException { - READING.start(this); - cdoClass = in.readCDOClassRefAndResolve(); - - id = in.readCDOID(); - version = in.readInt(); - if (!id.isTemporary()) - { - created = in.readLong(); - revised = in.readLong(); - } - - resourceID = in.readCDOID(); - containerID = in.readCDOID(); - containingFeatureID = in.readInt(); - if (TRACER.isEnabled()) - { - TRACER - .format( - "Reading revision: ID={0}, className={1}, version={2}, created={3}, revised={4}, resource={5}, container={6}, feature={7}", - id, cdoClass.getName(), version, created, revised, resourceID, containerID, containingFeatureID); - } - - readValues(in); - READING.stop(this); - } - - public void write(CDODataOutput out, int referenceChunk) throws IOException - { - CDOClassRef classRef = cdoClass.createClassRef(); - if (TRACER.isEnabled()) - { - TRACER - .format( - "Writing revision: ID={0}, classRef={1}, className={2}, version={3}, created={4}, revised={5}, resource={6}, container={7}, feature={8}", - id, classRef, cdoClass.getName(), getVersion(), created, revised, resourceID, containerID, - containingFeatureID); - } - - WRITING.start(this); - out.writeCDOClassRef(classRef); - out.writeCDOID(id); - out.writeInt(getVersion()); - if (!id.isTemporary()) - { - out.writeLong(created); - out.writeLong(revised); - } - - out.writeCDOID(resourceID); - Object newContainerID = out.getIDProvider().provideCDOID(containerID); - out.writeCDOID((CDOID)newContainerID); - out.writeInt(containingFeatureID); - writeValues(out, referenceChunk); - WRITING.stop(this); - } - - public CDOClass getCDOClass() - { - return cdoClass; - } - - public CDOID getID() - { - return id; - } - - public void setID(CDOID id) - { - if (TRACER.isEnabled()) - { - TRACER.format("Setting ID: {0}", id); - } - - this.id = id; - } - - public int getVersion() - { - return version < 0 ? -version : version; - } - - public void setVersion(int version) - { - if (TRACER.isEnabled()) - { - TRACER.format("Setting version for {0}: v{1}", this, version); - } - - this.version = version; - } - - public boolean isTransactional() - { - return version < 0; - } - - public int setTransactional() - { - if (TRACER.isEnabled()) - { - TRACER.format("Setting transactional {0}: v{1}", this, -(version + 1)); - } - - version = -(version + 1); - return version; - } - - public void setUntransactional() - { - if (TRACER.isEnabled()) - { - TRACER.format("Setting untransactional {0}: v{1}", this, Math.abs(version)); - } - - version = Math.abs(version); - } - - public long getCreated() - { - return created; + super(in); } - public void setCreated(long created) - { - if (TRACER.isEnabled()) - { - TRACER.format("Setting created {0}: {1,date} {1,time}", this, created); - } - - this.created = created; - } - - public long getRevised() - { - return revised; - } - - public void setRevised(long revised) - { - if (revised != UNSPECIFIED_DATE && revised < Math.max(0, created)) - { - throw new IllegalArgumentException("created=" + created + ", revised=" + revised); - } - - if (TRACER.isEnabled()) - { - TRACER.format("Setting revised {0}: {1,date} {1,time}", this, revised); - } - - this.revised = revised; - } - - public boolean isCurrent() - { - return revised == UNSPECIFIED_DATE; - } - - public boolean isValid(long timeStamp) - { - return (revised == UNSPECIFIED_DATE || revised >= timeStamp) && timeStamp >= created; - } - - public boolean isResourceNode() - { - return cdoClass.isResourceNode(); - } - - public boolean isResourceFolder() - { - return cdoClass.isResourceFolder(); - } - - public boolean isResource() - { - return cdoClass.isResource(); - } - - public CDORevisionData data() - { - return this; - } - - public CDORevision revision() - { - return this; - } - - public InternalCDORevisionDelta compare(CDORevision origin) - { - return (InternalCDORevisionDelta)CDORevisionDeltaUtil.create(origin, this); - } - - public void merge(CDORevisionDelta delta) - { - CDORevisionMerger applier = new CDORevisionMerger(); - applier.merge(this, delta); - } - - public CDOID getResourceID() - { - return resourceID; - } - - public void setResourceID(CDOID resourceID) - { - if (TRACER.isEnabled()) - { - TRACER.format("Setting resourceID {0}: {1}", this, resourceID); - } - - this.resourceID = resourceID; - } - - public Object getContainerID() - { - return containerID; - } - - public void setContainerID(Object containerID) - { - if (TRACER.isEnabled()) - { - TRACER.format("Setting containerID {0}: {1}", this, containerID); - } - - this.containerID = containerID; - } - - public int getContainingFeatureID() - { - return containingFeatureID; - } - - public void setContainingFeatureID(int containingFeatureID) - { - if (TRACER.isEnabled()) - { - TRACER.format("Setting containingFeatureID {0}: {1}", this, containingFeatureID); - } - - this.containingFeatureID = containingFeatureID; - } - - public int hashCode(CDOFeature feature) - { - return getValue(feature).hashCode(); - } - - public Object get(CDOFeature feature, int index) - { - if (feature.isMany()) - { - return getList(feature).get(index); - } - - return getValue(feature); - } - - public boolean contains(CDOFeature feature, Object value) - { - return getList(feature).contains(value); - } - - public int indexOf(CDOFeature feature, Object value) - { - return getList(feature).indexOf(value); - } - - public boolean isEmpty(CDOFeature feature) - { - return getList(feature).isEmpty(); - } - - public boolean isSet(CDOFeature feature) - { - return getValue(feature) != null; - } - - public int lastIndexOf(CDOFeature feature, Object value) - { - return getList(feature).lastIndexOf(value); - } - - public int size(CDOFeature feature) - { - return getList(feature).size(); - } - - public Object[] toArray(CDOFeature feature) - { - if (!feature.isMany()) - { - throw new IllegalStateException("!feature.isMany()"); - } - - return getList(feature).toArray(); - } - - public <T> T[] toArray(CDOFeature feature, T[] array) - { - if (!feature.isMany()) - { - throw new IllegalStateException("!feature.isMany()"); - } - - return getList(feature).toArray(array); - } - - public void add(CDOFeature feature, int index, Object value) - { - getList(feature).add(index, value); - } - - public void clear(CDOFeature feature) - { - setValue(feature, null); - } - - public Object move(CDOFeature feature, int targetIndex, int sourceIndex) - { - return getList(feature).move(targetIndex, sourceIndex); - } - - public Object remove(CDOFeature feature, int index) - { - return getList(feature).remove(index); - } - - public Object set(CDOFeature feature, int index, Object value) - { - if (feature.isMany()) - { - return getList(feature).set(index, value); - } - - return setValue(feature, value); - } - - public void unset(CDOFeature feature) - { - setValue(feature, null); - } - - public void adjustReferences(CDOReferenceAdjuster revisionAdjuster) + public CDORevisionImpl(CDORevisionImpl source) { - if (TRACER.isEnabled()) - { - TRACER.format("Adjusting references for revision {0}", this); - } - - resourceID = (CDOID)revisionAdjuster.adjustReference(resourceID); - containerID = revisionAdjuster.adjustReference(containerID); - - CDOFeature[] features = cdoClass.getAllFeatures(); + super(source); + CDOFeature[] features = getCDOClass().getAllFeatures(); + initValues(features.length); for (int i = 0; i < features.length; i++) { CDOFeature feature = features[i]; + CDOType type = feature.getType(); if (feature.isMany()) { - InternalCDOList list = (InternalCDOList)getValueAsList(i); - if (list != null) + InternalCDOList sourceList = (InternalCDOList)source.values[i]; + if (sourceList != null) { - list.adjustReferences(revisionAdjuster, feature.getType()); + setValue(i, sourceList.clone(type)); } } else { - values[i] = feature.getType().adjustReferences(revisionAdjuster, values[i]); + setValue(i, type.copyValue(source.values[i])); } } } - private CDOList getValueAsList(int i) + public CDORevision copy() { - return (CDOList)values[i]; + return new CDORevisionImpl(this); } @Override - public String toString() + protected void initValues(int size) { - return cdoClass.getName() + "@" + id + "v" + version; + values = new Object[size]; } - public Object getValue(CDOFeature feature) + @Override + protected Object getValue(int i) { - int i = cdoClass.getFeatureID(feature); return values[i]; } - public Object setValue(CDOFeature feature, Object value) - { - int i = cdoClass.getFeatureID(feature); - - try - { - Object old = values[i]; - values[i] = value; - return old; - } - catch (ArrayIndexOutOfBoundsException ex) - { - throw new IllegalArgumentException("Could not find feature " + feature + " in class " + cdoClass, ex); - } - } - - public CDOList getList(CDOFeature feature) - { - return getList(feature, 0); - } - - public CDOList getList(CDOFeature feature, int size) - { - int i = cdoClass.getFeatureID(feature); - CDOList list = (CDOList)values[i]; - if (list == null && size != -1) - { - list = CDOListFactory.DEFAULT.createList(size, 0, 0); - values[i] = list; - } - return list; - } - - public void setList(CDOFeature feature, InternalCDOList list) - { - int i = cdoClass.getFeatureID(feature); - values[i] = list; - } - - public void setListSize(CDOFeature feature, int size) - { - MoveableList<Object> list = getList(feature, size); - for (int j = list.size(); j < size; j++) - { - list.add(InternalCDORevision.UNINITIALIZED); - } - } - - private void copyValues(Object[] sourceValues) - { - CDOFeature[] features = cdoClass.getAllFeatures(); - values = new Object[features.length]; - for (int i = 0; i < features.length; i++) - { - CDOFeature feature = features[i]; - CDOType type = feature.getType(); - if (feature.isMany()) - { - InternalCDOList sourceList = (InternalCDOList)sourceValues[i]; - if (sourceList != null) - { - values[i] = sourceList.clone(type); - } - } - else - { - values[i] = type.copyValue(sourceValues[i]); - } - } - } - - private void readValues(CDODataInput in) throws IOException - { - CDOFeature[] features = cdoClass.getAllFeatures(); - values = new Object[features.length]; - for (int i = 0; i < features.length; i++) - { - CDOFeature feature = features[i]; - CDOType type = feature.getType(); - if (feature.isMany()) - { - values[i] = in.readCDOList(this, feature); - } - else - { - values[i] = type.readValue(in); - if (TRACER.isEnabled()) - { - TRACER.format("Read feature {0}: {1}", feature, values[i]); - } - } - } - } - - private void writeValues(CDODataOutput out, int referenceChunk) throws IOException - { - CDOFeature[] features = cdoClass.getAllFeatures(); - for (int i = 0; i < features.length; i++) - { - CDOFeature feature = features[i]; - if (feature.isMany()) - { - out.writeCDOList(getValueAsList(i), feature, referenceChunk); - } - else - { - Object value = values[i]; - if (value != null && feature.isReference()) - { - value = out.getIDProvider().provideCDOID(value); - } - - if (TRACER.isEnabled()) - { - TRACER.format("Writing feature {0}: {1}", feature, value); - } - - feature.getType().writeValue(out, value); - } - } - } - - public static Object remapID(Object value, Map<CDOIDTemp, CDOID> idMappings) + @Override + protected void setValue(int i, Object value) { - if (value instanceof CDOIDTemp) - { - CDOIDTemp oldID = (CDOIDTemp)value; - if (!oldID.isNull()) - { - CDOID newID = idMappings.get(oldID); - if (newID == null) - { - throw new ImplementationError("Missing ID mapping for " + oldID); - } - - if (TRACER.isEnabled()) - { - TRACER.format("Adjusting ID: {0} --> {1}", oldID, newID); - } - - return newID; - } - } - - return value; + values[i] = value; } } diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/AbstractCDORevision.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/AbstractCDORevision.java new file mode 100644 index 0000000000..b4ad8768e1 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/AbstractCDORevision.java @@ -0,0 +1,626 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2008 Eike Stepper, Germany. + * 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 + * Simon McDuff - http://bugs.eclipse.org/201266 + * Simon McDuff - http://bugs.eclipse.org/212958 + * Simon McDuff - http://bugs.eclipse.org/213402 + **************************************************************************/ +package org.eclipse.emf.cdo.spi.common; + +import org.eclipse.emf.cdo.common.CDODataInput; +import org.eclipse.emf.cdo.common.CDODataOutput; +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDTemp; +import org.eclipse.emf.cdo.common.id.CDOIDUtil; +import org.eclipse.emf.cdo.common.model.CDOClass; +import org.eclipse.emf.cdo.common.model.CDOClassRef; +import org.eclipse.emf.cdo.common.model.CDOFeature; +import org.eclipse.emf.cdo.common.model.CDOType; +import org.eclipse.emf.cdo.common.revision.CDOList; +import org.eclipse.emf.cdo.common.revision.CDOListFactory; +import org.eclipse.emf.cdo.common.revision.CDOReferenceAdjuster; +import org.eclipse.emf.cdo.common.revision.CDORevision; +import org.eclipse.emf.cdo.common.revision.CDORevisionData; +import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; +import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDeltaUtil; +import org.eclipse.emf.cdo.internal.common.bundle.OM; +import org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionMerger; + +import org.eclipse.net4j.util.ImplementationError; +import org.eclipse.net4j.util.collection.MoveableList; +import org.eclipse.net4j.util.om.trace.ContextTracer; +import org.eclipse.net4j.util.om.trace.PerfTracer; + +import java.io.IOException; +import java.util.Map; + +/** + * @author Eike Stepper + * @since 2.0 + */ +public abstract class AbstractCDORevision implements InternalCDORevision +{ + private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_REVISION, AbstractCDORevision.class); + + private static final PerfTracer READING = new PerfTracer(OM.PERF_REVISION_READING, AbstractCDORevision.class); + + private static final PerfTracer WRITING = new PerfTracer(OM.PERF_REVISION_WRITING, AbstractCDORevision.class); + + private CDOClass cdoClass; + + private CDOID id; + + private int version; + + private long created; + + private long revised; + + private CDOID resourceID; + + private Object containerID; + + private int containingFeatureID; + + public AbstractCDORevision(CDOClass cdoClass, CDOID id) + { + if (cdoClass.isAbstract()) + { + throw new IllegalArgumentException("CDOClass is abstract: " + cdoClass); + } + + if (CDOIDUtil.isNull(id)) + { + throw new IllegalArgumentException("CDIID is null"); + } + + this.cdoClass = cdoClass; + this.id = id; + version = 0; + created = UNSPECIFIED_DATE; + revised = UNSPECIFIED_DATE; + resourceID = CDOID.NULL; + containerID = CDOID.NULL; + containingFeatureID = 0; + initValues(cdoClass.getAllFeatures().length); + } + + public AbstractCDORevision(AbstractCDORevision source) + { + cdoClass = source.cdoClass; + id = source.id; + version = source.version; + created = source.created; + revised = source.revised; // == UNSPECIFIED + resourceID = source.resourceID; + containerID = source.containerID; + containingFeatureID = source.containingFeatureID; + } + + public AbstractCDORevision(CDODataInput in) throws IOException + { + READING.start(this); + cdoClass = in.readCDOClassRefAndResolve(); + + id = in.readCDOID(); + version = in.readInt(); + if (!id.isTemporary()) + { + created = in.readLong(); + revised = in.readLong(); + } + + resourceID = in.readCDOID(); + containerID = in.readCDOID(); + containingFeatureID = in.readInt(); + if (TRACER.isEnabled()) + { + TRACER + .format( + "Reading revision: ID={0}, className={1}, version={2}, created={3}, revised={4}, resource={5}, container={6}, feature={7}", + id, cdoClass.getName(), version, created, revised, resourceID, containerID, containingFeatureID); + } + + readValues(in); + READING.stop(this); + } + + public void write(CDODataOutput out, int referenceChunk) throws IOException + { + CDOClassRef classRef = cdoClass.createClassRef(); + if (TRACER.isEnabled()) + { + TRACER + .format( + "Writing revision: ID={0}, classRef={1}, className={2}, version={3}, created={4}, revised={5}, resource={6}, container={7}, feature={8}", + id, classRef, cdoClass.getName(), getVersion(), created, revised, resourceID, containerID, + containingFeatureID); + } + + WRITING.start(this); + out.writeCDOClassRef(classRef); + out.writeCDOID(id); + out.writeInt(getVersion()); + if (!id.isTemporary()) + { + out.writeLong(created); + out.writeLong(revised); + } + + out.writeCDOID(resourceID); + Object newContainerID = out.getIDProvider().provideCDOID(containerID); + out.writeCDOID((CDOID)newContainerID); + out.writeInt(containingFeatureID); + writeValues(out, referenceChunk); + WRITING.stop(this); + } + + public CDOClass getCDOClass() + { + return cdoClass; + } + + public CDOID getID() + { + return id; + } + + public void setID(CDOID id) + { + if (TRACER.isEnabled()) + { + TRACER.format("Setting ID: {0}", id); + } + + this.id = id; + } + + public int getVersion() + { + return version < 0 ? -version : version; + } + + public void setVersion(int version) + { + if (TRACER.isEnabled()) + { + TRACER.format("Setting version for {0}: v{1}", this, version); + } + + this.version = version; + } + + public boolean isTransactional() + { + return version < 0; + } + + public int setTransactional() + { + if (TRACER.isEnabled()) + { + TRACER.format("Setting transactional {0}: v{1}", this, -(version + 1)); + } + + version = -(version + 1); + return version; + } + + public void setUntransactional() + { + if (TRACER.isEnabled()) + { + TRACER.format("Setting untransactional {0}: v{1}", this, Math.abs(version)); + } + + version = Math.abs(version); + } + + public long getCreated() + { + return created; + } + + public void setCreated(long created) + { + if (TRACER.isEnabled()) + { + TRACER.format("Setting created {0}: {1,date} {1,time}", this, created); + } + + this.created = created; + } + + public long getRevised() + { + return revised; + } + + public void setRevised(long revised) + { + if (revised != UNSPECIFIED_DATE && revised < Math.max(0, created)) + { + throw new IllegalArgumentException("created=" + created + ", revised=" + revised); + } + + if (TRACER.isEnabled()) + { + TRACER.format("Setting revised {0}: {1,date} {1,time}", this, revised); + } + + this.revised = revised; + } + + public boolean isCurrent() + { + return revised == UNSPECIFIED_DATE; + } + + public boolean isValid(long timeStamp) + { + return (revised == UNSPECIFIED_DATE || revised >= timeStamp) && timeStamp >= created; + } + + public boolean isResourceNode() + { + return cdoClass.isResourceNode(); + } + + public boolean isResourceFolder() + { + return cdoClass.isResourceFolder(); + } + + public boolean isResource() + { + return cdoClass.isResource(); + } + + public CDORevisionData data() + { + return this; + } + + public CDORevision revision() + { + return this; + } + + public InternalCDORevisionDelta compare(CDORevision origin) + { + return (InternalCDORevisionDelta)CDORevisionDeltaUtil.create(origin, this); + } + + public void merge(CDORevisionDelta delta) + { + CDORevisionMerger applier = new CDORevisionMerger(); + applier.merge(this, delta); + } + + public CDOID getResourceID() + { + return resourceID; + } + + public void setResourceID(CDOID resourceID) + { + if (TRACER.isEnabled()) + { + TRACER.format("Setting resourceID {0}: {1}", this, resourceID); + } + + this.resourceID = resourceID; + } + + public Object getContainerID() + { + return containerID; + } + + public void setContainerID(Object containerID) + { + if (TRACER.isEnabled()) + { + TRACER.format("Setting containerID {0}: {1}", this, containerID); + } + + this.containerID = containerID; + } + + public int getContainingFeatureID() + { + return containingFeatureID; + } + + public void setContainingFeatureID(int containingFeatureID) + { + if (TRACER.isEnabled()) + { + TRACER.format("Setting containingFeatureID {0}: {1}", this, containingFeatureID); + } + + this.containingFeatureID = containingFeatureID; + } + + public int hashCode(CDOFeature feature) + { + return getValue(feature).hashCode(); + } + + public Object get(CDOFeature feature, int index) + { + if (feature.isMany()) + { + return getList(feature).get(index); + } + + return getValue(feature); + } + + public boolean contains(CDOFeature feature, Object value) + { + return getList(feature).contains(value); + } + + public int indexOf(CDOFeature feature, Object value) + { + return getList(feature).indexOf(value); + } + + public boolean isEmpty(CDOFeature feature) + { + return getList(feature).isEmpty(); + } + + public boolean isSet(CDOFeature feature) + { + return getValue(feature) != null; + } + + public int lastIndexOf(CDOFeature feature, Object value) + { + return getList(feature).lastIndexOf(value); + } + + public int size(CDOFeature feature) + { + return getList(feature).size(); + } + + public Object[] toArray(CDOFeature feature) + { + if (!feature.isMany()) + { + throw new IllegalStateException("!feature.isMany()"); + } + + return getList(feature).toArray(); + } + + public <T> T[] toArray(CDOFeature feature, T[] array) + { + if (!feature.isMany()) + { + throw new IllegalStateException("!feature.isMany()"); + } + + return getList(feature).toArray(array); + } + + public void add(CDOFeature feature, int index, Object value) + { + getList(feature).add(index, value); + } + + public void clear(CDOFeature feature) + { + setValue(feature, null); + } + + public Object move(CDOFeature feature, int targetIndex, int sourceIndex) + { + return getList(feature).move(targetIndex, sourceIndex); + } + + public Object remove(CDOFeature feature, int index) + { + return getList(feature).remove(index); + } + + public Object set(CDOFeature feature, int index, Object value) + { + if (feature.isMany()) + { + return getList(feature).set(index, value); + } + + return setValue(feature, value); + } + + public void unset(CDOFeature feature) + { + setValue(feature, null); + } + + public void adjustReferences(CDOReferenceAdjuster revisionAdjuster) + { + if (TRACER.isEnabled()) + { + TRACER.format("Adjusting references for revision {0}", this); + } + + resourceID = (CDOID)revisionAdjuster.adjustReference(resourceID); + containerID = revisionAdjuster.adjustReference(containerID); + + CDOFeature[] features = cdoClass.getAllFeatures(); + for (int i = 0; i < features.length; i++) + { + CDOFeature feature = features[i]; + if (feature.isMany()) + { + InternalCDOList list = (InternalCDOList)getValueAsList(i); + if (list != null) + { + list.adjustReferences(revisionAdjuster, feature.getType()); + } + } + else + { + setValue(i, feature.getType().adjustReferences(revisionAdjuster, getValue(i))); + } + } + } + + @Override + public String toString() + { + return cdoClass.getName() + "@" + id + "v" + version; + } + + public Object getValue(CDOFeature feature) + { + int i = cdoClass.getFeatureID(feature); + return getValue(i); + } + + public Object setValue(CDOFeature feature, Object value) + { + int i = cdoClass.getFeatureID(feature); + + try + { + Object old = getValue(i); + setValue(i, value); + return old; + } + catch (ArrayIndexOutOfBoundsException ex) + { + throw new IllegalArgumentException("Could not find feature " + feature + " in class " + cdoClass, ex); + } + } + + public CDOList getList(CDOFeature feature) + { + return getList(feature, 0); + } + + public CDOList getList(CDOFeature feature, int size) + { + int i = cdoClass.getFeatureID(feature); + CDOList list = (CDOList)getValue(i); + if (list == null && size != -1) + { + list = CDOListFactory.DEFAULT.createList(size, 0, 0); + setValue(i, list); + } + return list; + } + + public void setList(CDOFeature feature, InternalCDOList list) + { + int i = cdoClass.getFeatureID(feature); + setValue(i, list); + } + + public void setListSize(CDOFeature feature, int size) + { + MoveableList<Object> list = getList(feature, size); + for (int j = list.size(); j < size; j++) + { + list.add(InternalCDORevision.UNINITIALIZED); + } + } + + protected abstract void initValues(int size); + + protected abstract Object getValue(int i); + + protected abstract void setValue(int i, Object value); + + private CDOList getValueAsList(int i) + { + return (CDOList)getValue(i); + } + + private void readValues(CDODataInput in) throws IOException + { + CDOFeature[] features = cdoClass.getAllFeatures(); + initValues(features.length); + for (int i = 0; i < features.length; i++) + { + CDOFeature feature = features[i]; + CDOType type = feature.getType(); + if (feature.isMany()) + { + setValue(i, in.readCDOList(this, feature)); + } + else + { + setValue(i, type.readValue(in)); + if (TRACER.isEnabled()) + { + TRACER.format("Read feature {0}: {1}", feature, getValue(i)); + } + } + } + } + + private void writeValues(CDODataOutput out, int referenceChunk) throws IOException + { + CDOFeature[] features = cdoClass.getAllFeatures(); + for (int i = 0; i < features.length; i++) + { + CDOFeature feature = features[i]; + if (feature.isMany()) + { + out.writeCDOList(getValueAsList(i), feature, referenceChunk); + } + else + { + Object value = getValue(i); + if (value != null && feature.isReference()) + { + value = out.getIDProvider().provideCDOID(value); + } + + if (TRACER.isEnabled()) + { + TRACER.format("Writing feature {0}: {1}", feature, value); + } + + feature.getType().writeValue(out, value); + } + } + } + + public static Object remapID(Object value, Map<CDOIDTemp, CDOID> idMappings) + { + if (value instanceof CDOIDTemp) + { + CDOIDTemp oldID = (CDOIDTemp)value; + if (!oldID.isNull()) + { + CDOID newID = idMappings.get(oldID); + if (newID == null) + { + throw new ImplementationError("Missing ID mapping for " + oldID); + } + + if (TRACER.isEnabled()) + { + TRACER.format("Adjusting ID: {0} --> {1}", oldID, newID); + } + + return newID; + } + } + + return value; + } +} diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/InternalCDORevision.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/InternalCDORevision.java index fc8a25438c..f58e6d4ad8 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/InternalCDORevision.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/InternalCDORevision.java @@ -11,6 +11,7 @@ **************************************************************************/ package org.eclipse.emf.cdo.spi.common; +import org.eclipse.emf.cdo.common.CDODataOutput; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.model.CDOFeature; import org.eclipse.emf.cdo.common.revision.CDOList; @@ -19,6 +20,8 @@ import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionData; import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; +import java.io.IOException; + /** * @author Eike Stepper */ @@ -83,4 +86,9 @@ public interface InternalCDORevision extends CDORevision, CDORevisionData, CDORe @Deprecated public void setListSize(CDOFeature feature, int size); + + /** + * @since 2.0 + */ + public void write(CDODataOutput out, int referenceChunk) throws IOException; } diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionProxy.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionProxy.java index ff40c03d44..2aee089300 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionProxy.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionProxy.java @@ -10,6 +10,7 @@ **************************************************************************/ package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer; +import org.eclipse.emf.cdo.common.CDODataOutput; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.model.CDOClass; import org.eclipse.emf.cdo.common.model.CDOFeature; @@ -24,6 +25,7 @@ import org.eclipse.emf.cdo.spi.common.InternalCDORevision; import org.hibernate.proxy.HibernateProxy; import org.hibernate.proxy.LazyInitializer; +import java.io.IOException; import java.io.Serializable; /** @@ -40,6 +42,16 @@ public class CDORevisionProxy implements HibernateProxy, InternalCDORevision, Se this.li = li; } + public CDORevision copy() + { + return new CDORevisionProxy(li); + } + + public void write(CDODataOutput out, int referenceChunk) throws IOException + { + li.getRevision().write(out, referenceChunk); + } + public Object writeReplace() { return this; @@ -245,6 +257,7 @@ public class CDORevisionProxy implements HibernateProxy, InternalCDORevision, Se li.getRevision().setID(id); } + @SuppressWarnings("deprecation") public void setListSize(CDOFeature feature, int size) { li.getRevision().setListSize(feature, size); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/MEMStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/MEMStoreAccessor.java index 57f2350bc6..82c308bf81 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/MEMStoreAccessor.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/MEMStoreAccessor.java @@ -20,7 +20,6 @@ import org.eclipse.emf.cdo.common.model.CDOPackage; import org.eclipse.emf.cdo.common.model.CDOPackageInfo; import org.eclipse.emf.cdo.common.query.CDOQueryInfo; import org.eclipse.emf.cdo.common.revision.CDORevision; -import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.server.IQueryContext; import org.eclipse.emf.cdo.server.ISession; @@ -209,7 +208,7 @@ public class MEMStoreAccessor extends StoreAccessor protected void writeRevisionDelta(CDORevisionDelta revisionDelta, long created) { CDORevision revision = getStore().getRevision(revisionDelta.getID()); - CDORevision newRevision = CDORevisionUtil.copy(revision); + CDORevision newRevision = revision.copy(); revisionDelta.apply(newRevision); ((InternalCDORevision)newRevision).setCreated(created); writeRevision(newRevision); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContextImpl.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContextImpl.java index a66d6fb03a..9ac2e2995e 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContextImpl.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContextImpl.java @@ -20,7 +20,6 @@ import org.eclipse.emf.cdo.common.model.core.CDOCorePackage; import org.eclipse.emf.cdo.common.model.resource.CDOResourcePackage; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionResolver; -import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.internal.common.revision.CDOIDMapper; import org.eclipse.emf.cdo.internal.server.bundle.OM; @@ -435,7 +434,7 @@ public class TransactionCommitContextImpl implements IStoreAccessor.CommitContex CDORevision originObject = revisionResolver.getRevisionByVersion(id, CDORevision.UNCHUNKED, version, loadOnDemand); if (originObject != null) { - InternalCDORevision dirtyObject = (InternalCDORevision)CDORevisionUtil.copy(originObject); + InternalCDORevision dirtyObject = (InternalCDORevision)originObject.copy(); dirtyObjectDelta.apply(dirtyObject); dirtyObject.setCreated(timeStamp); // dirtyObject.setVersion(originObject.getVersion() + 1); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionDeltaTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionDeltaTest.java index 4f3e6fe995..4be7efbf51 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionDeltaTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionDeltaTest.java @@ -17,7 +17,6 @@ import org.eclipse.emf.cdo.CDOTransaction; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.model.CDOFeature; import org.eclipse.emf.cdo.common.revision.CDORevision; -import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; import org.eclipse.emf.cdo.common.revision.delta.CDOAddFeatureDelta; import org.eclipse.emf.cdo.common.revision.delta.CDOClearFeatureDelta; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; @@ -218,7 +217,7 @@ public abstract class RevisionDeltaTest extends AbstractCDOTest private InternalCDORevision getCopyCDORevision(Object object) { - return (InternalCDORevision)CDORevisionUtil.copy(((CDOObject)object).cdoRevision()); + return (InternalCDORevision)((CDOObject)object).cdoRevision().copy(); } /** diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java index 8a5708a3b9..be7eef8e26 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java @@ -10,8 +10,8 @@ **************************************************************************/ package org.eclipse.emf.cdo.tests; +import org.eclipse.emf.cdo.common.CDODataOutput; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDProvider; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOClass; import org.eclipse.emf.cdo.common.model.CDOFeature; @@ -19,7 +19,6 @@ import org.eclipse.emf.cdo.common.revision.CDOList; import org.eclipse.emf.cdo.common.revision.CDOReferenceAdjuster; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionData; -import org.eclipse.emf.cdo.common.revision.CDORevisionResolver; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.internal.common.revision.cache.lru.DLRevisionHolder; import org.eclipse.emf.cdo.internal.common.revision.cache.lru.LRURevisionCache; @@ -29,8 +28,6 @@ import org.eclipse.emf.cdo.internal.common.revision.cache.lru.RevisionHolder; import org.eclipse.emf.cdo.spi.common.InternalCDOList; import org.eclipse.emf.cdo.spi.common.InternalCDORevision; -import org.eclipse.net4j.util.io.ExtendedDataOutput; - import java.io.IOException; import java.util.LinkedList; import java.util.List; @@ -346,11 +343,6 @@ public class RevisionHolderTest extends AbstractCDOTest throw new UnsupportedOperationException(); } - public CDORevisionResolver getRevisionResolver() - { - throw new UnsupportedOperationException(); - } - public boolean isResourceNode() { throw new UnsupportedOperationException(); @@ -376,7 +368,12 @@ public class RevisionHolderTest extends AbstractCDOTest throw new UnsupportedOperationException(); } - public void write(ExtendedDataOutput out, CDOIDProvider idProvider, int referenceChunk) throws IOException + public CDORevision copy() + { + return new TestRevision(CDOIDUtil.getLong(id), version, created, revised); + } + + public void write(CDODataOutput out, int referenceChunk) throws IOException { throw new UnsupportedOperationException(); } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOSession.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOSession.java index 53cb8d7c21..51ee19609f 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOSession.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOSession.java @@ -14,6 +14,7 @@ package org.eclipse.emf.cdo; import org.eclipse.emf.cdo.common.CDOProtocolSession; import org.eclipse.emf.cdo.common.model.CDOPackage; import org.eclipse.emf.cdo.common.revision.CDORevision; +import org.eclipse.emf.cdo.common.revision.CDORevisionFactory; import org.eclipse.emf.cdo.util.CDOPackageRegistry; import org.eclipse.net4j.util.container.IContainer; @@ -209,6 +210,16 @@ public interface CDOSession extends CDOProtocolSession, IContainer<CDOView> * Returns the CDOCollectionLoadingPolicy currently being used by this session. */ public void setCollectionLoadingPolicy(CDOCollectionLoadingPolicy policy); + + /** + * Returns the CDORevisionFactory currently being used by this session. + */ + public CDORevisionFactory getRevisionFactory(); + + /** + * Sets the CDORevisionFactory to be used by this session. + */ + public void setRevisionFactory(CDORevisionFactory factory); } /** diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectMerger.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectMerger.java index 5c50c473cf..dfcfb13917 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectMerger.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectMerger.java @@ -12,7 +12,6 @@ package org.eclipse.emf.internal.cdo; import org.eclipse.emf.cdo.CDOState; -import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionMerger; import org.eclipse.emf.cdo.spi.common.InternalCDORevision; @@ -28,7 +27,7 @@ public class CDOObjectMerger extends CDORevisionMerger public void merge(InternalCDOObject object, CDORevisionDelta delta) { - InternalCDORevision revision = (InternalCDORevision)CDORevisionUtil.copy(object.cdoRevision()); + InternalCDORevision revision = (InternalCDORevision)object.cdoRevision().copy(); revision.setTransactional(); object.cdoInternalSetRevision(revision); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java index 447cdd53fa..1479f10a1d 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java @@ -21,6 +21,7 @@ import org.eclipse.emf.cdo.CDOSessionInvalidationEvent; import org.eclipse.emf.cdo.CDOTimeStampContext; import org.eclipse.emf.cdo.CDOView; import org.eclipse.emf.cdo.CDOSession.Repository; +import org.eclipse.emf.cdo.common.CDODataInput; import org.eclipse.emf.cdo.common.CDOProtocolConstants; import org.eclipse.emf.cdo.common.CDOProtocolView; import org.eclipse.emf.cdo.common.id.CDOID; @@ -32,8 +33,11 @@ import org.eclipse.emf.cdo.common.id.CDOIDObjectFactory; import org.eclipse.emf.cdo.common.id.CDOIDTemp; import org.eclipse.emf.cdo.common.id.CDOIDTempMeta; import org.eclipse.emf.cdo.common.id.CDOIDUtil; +import org.eclipse.emf.cdo.common.model.CDOClass; import org.eclipse.emf.cdo.common.model.CDOPackage; import org.eclipse.emf.cdo.common.revision.CDORevision; +import org.eclipse.emf.cdo.common.revision.CDORevisionFactory; +import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.spi.common.InternalCDORevision; import org.eclipse.emf.cdo.util.CDOPackageRegistry; @@ -100,6 +104,8 @@ public class CDOSessionImpl extends Container<CDOView> implements InternalCDOSes private CDOCollectionLoadingPolicy collectionLoadingPolicy; + private CDORevisionFactory revisionFactory; + private CDOClientProtocol protocol; @ExcludeFromDump @@ -229,6 +235,44 @@ public class CDOSessionImpl extends Container<CDOView> implements InternalCDOSes collectionLoadingPolicy = policy; } + /** + * @since 2.0 + */ + public synchronized CDORevisionFactory getRevisionFactory() + { + if (revisionFactory == null) + { + revisionFactory = new CDORevisionFactory() + { + public CDORevision createRevision(CDOClass cdoClass, CDOID id) + { + return CDORevisionUtil.create(cdoClass, id); + } + + public CDORevision createRevision(CDODataInput in) throws IOException + { + return CDORevisionUtil.read(in); + } + + @Override + public String toString() + { + return "DefaultRevisionFactory"; + } + }; + } + + return revisionFactory; + } + + /** + * @since 2.0 + */ + public synchronized void setRevisionFactory(CDORevisionFactory revisionFactory) + { + this.revisionFactory = revisionFactory; + } + public CDOClientProtocol getProtocol() { return protocol; diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java index a87b272717..40a50514fd 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java @@ -18,7 +18,7 @@ import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDTemp; import org.eclipse.emf.cdo.common.model.CDOClass; import org.eclipse.emf.cdo.common.revision.CDORevision; -import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; +import org.eclipse.emf.cdo.common.revision.CDORevisionFactory; import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.common.util.TransportException; @@ -450,7 +450,8 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent // Create new revision CDOClass cdoClass = object.cdoClass(); - InternalCDORevision revision = (InternalCDORevision)CDORevisionUtil.create(cdoClass, id); + CDORevisionFactory factory = transaction.getSession().options().getRevisionFactory(); + InternalCDORevision revision = (InternalCDORevision)factory.createRevision(cdoClass, id); revision.setVersion(-1); object.cdoInternalSetRevision(revision); @@ -599,7 +600,7 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent public void execute(InternalCDOObject object, CDOState state, CDOEvent event, Object featureDelta) { // Copy revision - InternalCDORevision revision = (InternalCDORevision)CDORevisionUtil.copy(object.cdoRevision()); + InternalCDORevision revision = (InternalCDORevision)object.cdoRevision().copy(); revision.setTransactional(); object.cdoInternalSetRevision(revision); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java index 5489b49196..a583fe8b21 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java @@ -26,7 +26,6 @@ import org.eclipse.emf.cdo.common.id.CDOIDTemp; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOPackage; import org.eclipse.emf.cdo.common.revision.CDORevision; -import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDeltaUtil; @@ -608,7 +607,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa CDORevision revision = newBaseRevision.get(id); if (revision != null) { - object.cdoInternalSetRevision(CDORevisionUtil.copy(revision)); + object.cdoInternalSetRevision(revision.copy()); object.cdoInternalSetView(this); object.cdoInternalSetID(revision.getID()); object.cdoInternalSetState(CDOState.NEW); @@ -815,7 +814,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa { // Load instance to revision ((InternalCDOObject)object).cdoInternalPreCommit(); - lastSavepoint.getBaseNewObjects().put(object.cdoID(), CDORevisionUtil.copy(object.cdoRevision())); + lastSavepoint.getBaseNewObjects().put(object.cdoID(), object.cdoRevision().copy()); } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/protocol/CDOClientIndication.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/protocol/CDOClientIndication.java index ce5d83aa03..113ada4d09 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/protocol/CDOClientIndication.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/protocol/CDOClientIndication.java @@ -18,6 +18,8 @@ import org.eclipse.emf.cdo.common.id.CDOIDObjectFactory; import org.eclipse.emf.cdo.common.model.CDOPackageManager; import org.eclipse.emf.cdo.common.model.CDOPackageURICompressor; import org.eclipse.emf.cdo.common.revision.CDOListFactory; +import org.eclipse.emf.cdo.common.revision.CDORevision; +import org.eclipse.emf.cdo.common.revision.CDORevisionFactory; import org.eclipse.emf.cdo.common.revision.CDORevisionResolver; import org.eclipse.emf.cdo.internal.common.CDODataInputImpl; @@ -76,6 +78,13 @@ public abstract class CDOClientIndication extends Indication indicating(new CDODataInputImpl(in) { @Override + protected CDORevision readCDORevisionData() throws IOException + { + CDORevisionFactory factory = getSession().options().getRevisionFactory(); + return factory.createRevision(this); + } + + @Override protected CDORevisionResolver getRevisionResolver() { return CDOClientIndication.this.getRevisionManager(); |