diff options
author | Eike Stepper | 2019-09-19 06:07:54 +0000 |
---|---|---|
committer | Eike Stepper | 2019-09-19 06:07:54 +0000 |
commit | 8c2bdd31d762cf3958af1cb0ba0735162d2aa3ac (patch) | |
tree | c06b2cbfb572d28613cba7c768d310be94c3f951 /plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common | |
parent | 8580a5382feae010a8276d7b10cff84778121668 (diff) | |
download | cdo-8c2bdd31d762cf3958af1cb0ba0735162d2aa3ac.tar.gz cdo-8c2bdd31d762cf3958af1cb0ba0735162d2aa3ac.tar.xz cdo-8c2bdd31d762cf3958af1cb0ba0735162d2aa3ac.zip |
[551232] [DB] Support range-based mappings in CDOServerImporter
https://bugs.eclipse.org/bugs/show_bug.cgi?id=551232
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common')
2 files changed, 196 insertions, 132 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java index 7799f7cf08..4b69884c7d 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java @@ -265,6 +265,27 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi } } + public InternalCDORevision getBaseRevision(CDORevision revision, int referenceChunk, boolean loadOnDemand) + { + CDOID id = revision.getID(); + CDOBranch branch = revision.getBranch(); + int version = revision.getVersion(); + + if (version == CDOBranchVersion.FIRST_VERSION) + { + if (branch.isMainBranch()) + { + return null; + } + + CDOBranchPoint basePoint = branch.getBase(); + return getRevision(id, basePoint, referenceChunk, CDORevision.DEPTH_NONE, loadOnDemand); + } + + CDOBranchVersion baseVersion = branch.getVersion(version - 1); + return getRevisionByVersion(id, baseVersion, referenceChunk, loadOnDemand); + } + public CDOBranchPointRange getObjectLifetime(CDOID id, CDOBranchPoint branchPoint) { if (revisionLoader instanceof RevisionLoader2) diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDORevisionDeltaImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDORevisionDeltaImpl.java index 0c1b50bff4..1a9468f1bb 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDORevisionDeltaImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDORevisionDeltaImpl.java @@ -23,7 +23,6 @@ import org.eclipse.emf.cdo.common.revision.CDOElementProxy; import org.eclipse.emf.cdo.common.revision.CDOList; import org.eclipse.emf.cdo.common.revision.CDORevisable; 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 org.eclipse.emf.cdo.common.revision.delta.CDOClearFeatureDelta; import org.eclipse.emf.cdo.common.revision.delta.CDOContainerFeatureDelta; @@ -68,7 +67,7 @@ import java.util.Map; /** * @author Eike Stepper */ -public class CDORevisionDeltaImpl implements InternalCDORevisionDelta +public class CDORevisionDeltaImpl implements InternalCDORevisionDelta, ListComparisonHandler { private static final boolean WORK_AROUND_BUG_308618 = OMPlatform.INSTANCE.isProperty("org.eclipse.emf.cdo.common.revision.delta.WORK_AROUND_BUG_308618"); @@ -122,22 +121,21 @@ public class CDORevisionDeltaImpl implements InternalCDORevisionDelta version = sourceRevision.getVersion(); target = CDORevisionUtil.copyRevisable(targetRevision); - compare((InternalCDORevision)sourceRevision, (InternalCDORevision)targetRevision); + InternalCDORevision internalSourceRevision = (InternalCDORevision)sourceRevision; + InternalCDORevision internalTargetRevision = (InternalCDORevision)targetRevision; + compare(internalSourceRevision, internalTargetRevision); - CDORevisionData originData = sourceRevision.data(); - CDORevisionData dirtyData = targetRevision.data(); - - Object dirtyContainerID = dirtyData.getContainerID(); + Object dirtyContainerID = internalTargetRevision.getContainerID(); if (dirtyContainerID instanceof CDOWithID) { dirtyContainerID = ((CDOWithID)dirtyContainerID).cdoID(); } - CDOID dirtyResourceID = dirtyData.getResourceID(); - int dirtyContainingFeatureID = dirtyData.getContainingFeatureID(); - if (!compareValue(CDOContainerFeatureDelta.CONTAINER_FEATURE, originData.getContainerID(), dirtyContainerID) - || !compareValue(null, originData.getContainingFeatureID(), dirtyContainingFeatureID) - || !compareValue(CDOContainerFeatureDelta.CONTAINER_FEATURE, originData.getResourceID(), dirtyResourceID)) + CDOID dirtyResourceID = internalTargetRevision.getResourceID(); + int dirtyContainingFeatureID = internalTargetRevision.getContainingFeatureID(); + if (!compareValue(CDOContainerFeatureDelta.CONTAINER_FEATURE, internalSourceRevision.getContainerID(), dirtyContainerID) + || !compareValue(null, internalSourceRevision.getContainingFeatureID(), dirtyContainingFeatureID) + || !compareValue(CDOContainerFeatureDelta.CONTAINER_FEATURE, internalSourceRevision.getResourceID(), dirtyResourceID)) { CDOFeatureDelta delta = new CDOContainerFeatureDeltaImpl(dirtyResourceID, dirtyContainerID, dirtyContainingFeatureID); addFeatureDelta(delta, null); @@ -366,131 +364,28 @@ public class CDORevisionDeltaImpl implements InternalCDORevisionDelta } } - private void compare(final InternalCDORevision originRevision, final InternalCDORevision dirtyRevision) + public void addDelta(CDOListFeatureDelta listFeatureDelta) { - CDORevisionData originData = originRevision.data(); - CDORevisionData dirtyData = dirtyRevision.data(); + featureDeltas.put(listFeatureDelta.getFeature(), listFeatureDelta); + } + + public void addClearDelta(CDOClearFeatureDelta clearFeatureDelta, CDOOriginSizeProvider originSizeProvider) + { + addFeatureDelta(clearFeatureDelta, originSizeProvider); + } - for (final EStructuralFeature feature : originRevision.getClassInfo().getAllPersistentFeatures()) + private void compare(InternalCDORevision originRevision, InternalCDORevision dirtyRevision) + { + for (EStructuralFeature feature : originRevision.getClassInfo().getAllPersistentFeatures()) { if (feature.isMany()) { - final int originSize = originData.size(feature); - if (originSize > 0 && dirtyData.size(feature) == 0) - { - addFeatureDelta(new CDOClearFeatureDeltaImpl(feature), new CDOOriginSizeProvider() - { - public int getOriginSize() - { - return originSize; - } - }); - } - else - { - CDOListFeatureDelta listFeatureDelta = new CDOListFeatureDeltaImpl(feature, originSize); - final List<CDOFeatureDelta> changes = listFeatureDelta.getListChanges(); - - ListDifferenceAnalyzer analyzer = new ListDifferenceAnalyzer() - { - @Override - public void analyzeLists(EList<Object> oldList, EList<?> newList, EList<ListChange> listChanges) - { - checkNoProxies(oldList, originRevision); - checkNoProxies(newList, dirtyRevision); - super.analyzeLists(oldList, newList, listChanges); - } - - @Override - protected void createAddListChange(EList<Object> oldList, EList<ListChange> listChanges, Object value, int index) - { - CDOFeatureDelta delta = new CDOAddFeatureDeltaImpl(feature, index, value); - changes.add(delta); - oldList.add(index, value); - } - - @Override - protected void createRemoveListChange(EList<?> oldList, EList<ListChange> listChanges, Object value, int index) - { - CDORemoveFeatureDeltaImpl delta = new CDORemoveFeatureDeltaImpl(feature, index); - - if (WORK_AROUND_BUG_308618) - { - // Fix until ListDifferenceAnalyzer delivers the correct value (bug 308618). - delta.setValue(oldList.get(index)); - } - else - { - delta.setValue(value); - } - - changes.add(delta); - oldList.remove(index); - } - - @Override - protected void createMoveListChange(EList<?> oldList, EList<ListChange> listChanges, Object value, int index, int toIndex) - { - CDOMoveFeatureDeltaImpl delta = new CDOMoveFeatureDeltaImpl(feature, toIndex, index); - - if (WORK_AROUND_BUG_308618) - { - // Fix until ListDifferenceAnalyzer delivers the correct value (bug 308618). - delta.setValue(oldList.get(index)); - } - else - { - delta.setValue(value); - } - - changes.add(delta); - oldList.move(toIndex, index); - } - - @Override - protected boolean equal(Object originValue, Object dirtyValue) - { - return compareValue(feature, originValue, dirtyValue); - } - - private void checkNoProxies(EList<?> list, CDORevision revision) - { - if (list != null && !((InternalCDORevision)revision).isUnchunked()) - { - for (Object element : list) - { - if (element instanceof CDOElementProxy || element == CDOListImpl.UNINITIALIZED) - { - throw new PartialCollectionLoadingNotSupportedException("List contains proxy elements"); - } - } - } - } - }; - - CDOList originList = originRevision.getListOrNull(feature); - if (originList == null) - { - originList = new CDOListImpl(0, 0); - } - - CDOList dirtyList = dirtyRevision.getListOrNull(feature); - if (dirtyList == null) - { - dirtyList = new CDOListImpl(0, 0); - } - - analyzer.analyzeLists(originList, dirtyList, new NOOPList()); - if (!changes.isEmpty()) - { - featureDeltas.put(feature, listFeatureDelta); - } - } + compareLists(originRevision, dirtyRevision, feature, this); } else { - Object originValue = originData.get(feature, 0); - Object dirtyValue = dirtyData.get(feature, 0); + Object originValue = originRevision.get(feature, 0); + Object dirtyValue = dirtyRevision.get(feature, 0); if (!compareValue(feature, originValue, dirtyValue)) { @@ -509,7 +404,7 @@ public class CDORevisionDeltaImpl implements InternalCDORevisionDelta } } - private boolean compareValue(EStructuralFeature feature, Object originValue, Object dirtyValue) + private static boolean compareValue(EStructuralFeature feature, Object originValue, Object dirtyValue) { if (feature != null) { @@ -552,7 +447,7 @@ public class CDORevisionDeltaImpl implements InternalCDORevisionDelta return originValue.equals(dirtyValue); } - private Object convertEObject(Object value) + private static Object convertEObject(Object value) { CDOID id = CDOIDUtil.getCDOID(value); if (id != null) @@ -563,7 +458,7 @@ public class CDORevisionDeltaImpl implements InternalCDORevisionDelta return value; } - private Object convertDefaultValue(Object value, Object defaultValue) + private static Object convertDefaultValue(Object value, Object defaultValue) { // if (value == null) // { @@ -573,6 +468,143 @@ public class CDORevisionDeltaImpl implements InternalCDORevisionDelta return value; } + private static void compareLists(final InternalCDORevision originRevision, final InternalCDORevision dirtyRevision, final EStructuralFeature feature, + ListComparisonHandler handler) + { + final int originSize = originRevision.size(feature); + if (originSize > 0 && dirtyRevision.size(feature) == 0) + { + handler.addClearDelta(new CDOClearFeatureDeltaImpl(feature), new CDOOriginSizeProvider() + { + public int getOriginSize() + { + return originSize; + } + }); + } + else + { + CDOListFeatureDelta listFeatureDelta = new CDOListFeatureDeltaImpl(feature, originSize); + final List<CDOFeatureDelta> changes = listFeatureDelta.getListChanges(); + + ListDifferenceAnalyzer analyzer = new ListDifferenceAnalyzer() + { + @Override + public void analyzeLists(EList<Object> oldList, EList<?> newList, EList<ListChange> listChanges) + { + checkNoProxies(oldList, originRevision); + checkNoProxies(newList, dirtyRevision); + super.analyzeLists(oldList, newList, listChanges); + } + + @Override + protected void createAddListChange(EList<Object> oldList, EList<ListChange> listChanges, Object value, int index) + { + CDOFeatureDelta delta = new CDOAddFeatureDeltaImpl(feature, index, value); + changes.add(delta); + oldList.add(index, value); + } + + @Override + protected void createRemoveListChange(EList<?> oldList, EList<ListChange> listChanges, Object value, int index) + { + CDORemoveFeatureDeltaImpl delta = new CDORemoveFeatureDeltaImpl(feature, index); + + if (WORK_AROUND_BUG_308618) + { + // Fix until ListDifferenceAnalyzer delivers the correct value (bug 308618). + delta.setValue(oldList.get(index)); + } + else + { + delta.setValue(value); + } + + changes.add(delta); + oldList.remove(index); + } + + @Override + protected void createMoveListChange(EList<?> oldList, EList<ListChange> listChanges, Object value, int index, int toIndex) + { + CDOMoveFeatureDeltaImpl delta = new CDOMoveFeatureDeltaImpl(feature, toIndex, index); + + if (WORK_AROUND_BUG_308618) + { + // Fix until ListDifferenceAnalyzer delivers the correct value (bug 308618). + delta.setValue(oldList.get(index)); + } + else + { + delta.setValue(value); + } + + changes.add(delta); + oldList.move(toIndex, index); + } + + @Override + protected boolean equal(Object originValue, Object dirtyValue) + { + return compareValue(feature, originValue, dirtyValue); + } + + private void checkNoProxies(EList<?> list, CDORevision revision) + { + if (list != null && !((InternalCDORevision)revision).isUnchunked()) + { + for (Object element : list) + { + if (element instanceof CDOElementProxy || element == CDOListImpl.UNINITIALIZED) + { + throw new PartialCollectionLoadingNotSupportedException("List contains proxy elements"); + } + } + } + } + }; + + CDOList originList = originRevision.getListOrNull(feature); + if (originList == null) + { + originList = new CDOListImpl(0, 0); + } + + CDOList dirtyList = dirtyRevision.getListOrNull(feature); + if (dirtyList == null) + { + dirtyList = new CDOListImpl(0, 0); + } + + analyzer.analyzeLists(originList, dirtyList, new NOOPList()); + if (!changes.isEmpty()) + { + handler.addDelta(listFeatureDelta); + } + } + } + + public static CDOListFeatureDelta compareLists(final InternalCDORevision originRevision, InternalCDORevision dirtyRevision, final EStructuralFeature feature) + { + final CDOListFeatureDelta[] result = { null }; + compareLists(originRevision, dirtyRevision, feature, new ListComparisonHandler() + { + public void addDelta(CDOListFeatureDelta listFeatureDelta) + { + result[0] = listFeatureDelta; + } + + public void addClearDelta(CDOClearFeatureDelta clearFeatureDelta, CDOOriginSizeProvider originSizeProvider) + { + CDOListFeatureDeltaImpl listFeatureDelta = new CDOListFeatureDeltaImpl(feature, originRevision.size(feature)); + listFeatureDelta.add(clearFeatureDelta); + result[0] = listFeatureDelta; + } + }); + + return result[0]; + } + @Override public String toString() { @@ -713,3 +745,14 @@ public class CDORevisionDeltaImpl implements InternalCDORevisionDelta } } } + +/** + * @author Eike Stepper + * @since 4.8 + */ +interface ListComparisonHandler +{ + public void addDelta(CDOListFeatureDelta listFeatureDelta); + + public void addClearDelta(CDOClearFeatureDelta clearFeatureDelta, CDOOriginSizeProvider originSizeProvider); +} |