@Override protected void resolveConflict( CDOObject conflict, CDORevisionDelta localDelta, List<CDORevisionDelta> remoteDeltas) { if (hasFeatureConflicts(localDelta, remoteDeltas)) { // TODO localDelta may be corrupt already and the transaction will not be able to restore // it!!! throw new CDOException( Messages.getString("AbstractObjectConflictResolver.0")); // $NON-NLS-1$ } rollbackObject(conflict); // Add remote deltas to local delta for (CDORevisionDelta remoteDelta : remoteDeltas) { for (CDOFeatureDelta remoteFeatureDelta : remoteDelta.getFeatureDeltas()) { // TODO Add public API for this: ((InternalCDORevisionDelta) localDelta).addFeatureDelta(remoteFeatureDelta); } } changeObject(conflict, localDelta); }
@Override protected Object changedInSourceAndTarget( CDORevisionDelta targetDelta, CDORevisionDelta sourceDelta) { InternalCDORevisionDelta result = new CDORevisionDeltaImpl(targetDelta, false); ChangedInSourceAndTargetConflict conflict = null; Map<EStructuralFeature, CDOFeatureDelta> targetMap = ((InternalCDORevisionDelta) targetDelta).getFeatureDeltaMap(); Map<EStructuralFeature, CDOFeatureDelta> sourceMap = ((InternalCDORevisionDelta) sourceDelta).getFeatureDeltaMap(); for (CDOFeatureDelta targetFeatureDelta : targetMap.values()) { EStructuralFeature feature = targetFeatureDelta.getFeature(); CDOFeatureDelta sourceFeatureDelta = sourceMap.get(feature); if (sourceFeatureDelta == null) { CDOFeatureDelta featureDelta = changedInTarget(targetFeatureDelta); if (featureDelta != null) { result.addFeatureDelta(featureDelta, null); } } else { CDOFeatureDelta featureDelta = changedInSourceAndTarget(targetFeatureDelta, sourceFeatureDelta); if (featureDelta != null) { result.addFeatureDelta(featureDelta, null); } else { if (conflict == null) { ResolutionPreference resolutionPreference = getResolutionPreference(); switch (resolutionPreference) { case SOURCE_OVER_TARGET: // TODO: implement // DefaultCDOMerger.PerFeature.changedInSourceAndTarget(targetDelta, sourceDelta) throw new UnsupportedOperationException(); case TARGET_OVER_SOURCE: // TODO: implement // DefaultCDOMerger.PerFeature.changedInSourceAndTarget(targetDelta, sourceDelta) throw new UnsupportedOperationException(); case NONE: conflict = new ChangedInSourceAndTargetConflict( new CDORevisionDeltaImpl(targetDelta, false), new CDORevisionDeltaImpl(sourceDelta, false)); break; default: throw new IllegalStateException( "Illegal resolution preference: " + resolutionPreference); } } ((InternalCDORevisionDelta) conflict.getTargetDelta()) .addFeatureDelta(targetFeatureDelta, null); ((InternalCDORevisionDelta) conflict.getSourceDelta()) .addFeatureDelta(sourceFeatureDelta, null); } } } for (CDOFeatureDelta sourceFeatureDelta : sourceMap.values()) { EStructuralFeature feature = sourceFeatureDelta.getFeature(); CDOFeatureDelta targetFeatureDelta = targetMap.get(feature); if (targetFeatureDelta == null) { CDOFeatureDelta featureDelta = changedInSource(sourceFeatureDelta); if (featureDelta != null) { result.addFeatureDelta(featureDelta, null); } } } if (result.isEmpty()) { return conflict; } if (conflict != null) { return Pair.create(result, conflict); } return result; }