diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/NonAuditListTableMapping.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/NonAuditListTableMapping.java | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/NonAuditListTableMapping.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/NonAuditListTableMapping.java index 9724f53eee..24bc772240 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/NonAuditListTableMapping.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/NonAuditListTableMapping.java @@ -13,7 +13,6 @@ package org.eclipse.emf.cdo.server.internal.db.mapping.horizontal; import org.eclipse.emf.cdo.common.branch.CDOBranch; -import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.delta.CDOAddFeatureDelta; @@ -31,7 +30,6 @@ import org.eclipse.emf.cdo.server.db.IIDHandler; import org.eclipse.emf.cdo.server.db.mapping.IListMappingDeltaSupport; import org.eclipse.emf.cdo.server.db.mapping.IMappingStrategy; import org.eclipse.emf.cdo.server.internal.db.bundle.OM; -import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; import org.eclipse.net4j.db.DBException; import org.eclipse.net4j.db.DBUtil; @@ -282,27 +280,16 @@ public class NonAuditListTableMapping extends AbstractListTableMapping implement public void processDelta(final IDBStoreAccessor accessor, final CDOID id, int branchId, int oldVersion, final int newVersion, long created, CDOListFeatureDelta delta) { - CDOBranchPoint main = accessor.getStore().getRepository().getBranchManager().getMainBranch().getHead(); - - int xxx; - InternalCDORevision originalRevision = (InternalCDORevision)accessor.getStore().getRepository() - .getRevisionManager().getRevision(id, main, CDORevision.UNCHUNKED, CDORevision.DEPTH_NONE, true); - int oldListSize = originalRevision.getList(getFeature()).size(); + int oldListSize = delta.getOriginSize(); if (TRACER.isEnabled()) { - TRACER.format("ListTableMapping.processDelta for revision {0} - previous list size: {1}", originalRevision, //$NON-NLS-1$ + TRACER.format("ListTableMapping.processDelta for object {0} - original list size: {1}", id, //$NON-NLS-1$ oldListSize); } // let the visitor collect the changes ListDeltaVisitor visitor = new ListDeltaVisitor(oldListSize); - - if (TRACER.isEnabled()) - { - TRACER.trace("Processing deltas..."); //$NON-NLS-1$ - } - for (CDOFeatureDelta listDelta : delta.getListChanges()) { listDelta.accept(visitor); @@ -312,6 +299,8 @@ public class NonAuditListTableMapping extends AbstractListTableMapping implement // finally, write results to the database visitor.writeResultToDatabase(accessor, id); + + throw new NewListSizeResult(visitor.getNewListSize()); } private void close(PreparedStatement... stmts) @@ -360,6 +349,26 @@ public class NonAuditListTableMapping extends AbstractListTableMapping implement /** * @author Eike Stepper */ + static final class NewListSizeResult extends RuntimeException + { + private static final long serialVersionUID = 1L; + + private final int newListSize; + + public NewListSizeResult(int newListSize) + { + this.newListSize = newListSize; + } + + public int getNewListSize() + { + return newListSize; + } + } + + /** + * @author Eike Stepper + */ private final class ListDeltaVisitor implements CDOFeatureDeltaVisitor { private boolean clearFirst; @@ -372,6 +381,8 @@ public class NonAuditListTableMapping extends AbstractListTableMapping implement */ private int tempIndex = -1; + private int newListSize; + public ListDeltaVisitor(int oldListSize) { // reset the clear-flag @@ -383,6 +394,13 @@ public class NonAuditListTableMapping extends AbstractListTableMapping implement { manipulations.add(ManipulationElement.createOriginalElement(i)); } + + newListSize = oldListSize; + } + + public int getNewListSize() + { + return newListSize; } public void visit(CDOAddFeatureDelta delta) @@ -397,6 +415,7 @@ public class NonAuditListTableMapping extends AbstractListTableMapping implement // create the item manipulations.add(ManipulationElement.createInsertedElement(delta.getIndex(), delta.getValue())); + ++newListSize; } public void visit(CDORemoveFeatureDelta delta) @@ -411,6 +430,7 @@ public class NonAuditListTableMapping extends AbstractListTableMapping implement // fill the gap by shifting all subsequent items down shiftIndexes(delta.getIndex() + 1, UNBOUNDED_SHIFT, -1); + --newListSize; } public void visit(CDOSetFeatureDelta delta) @@ -451,6 +471,7 @@ public class NonAuditListTableMapping extends AbstractListTableMapping implement // and also clear all manipulation items manipulations.clear(); + newListSize = 0; } public void visit(CDOClearFeatureDelta delta) @@ -465,6 +486,7 @@ public class NonAuditListTableMapping extends AbstractListTableMapping implement // and also clear all manipulation items manipulations.clear(); + newListSize = 0; } public void visit(CDOMoveFeatureDelta delta) @@ -601,7 +623,6 @@ public class NonAuditListTableMapping extends AbstractListTableMapping implement applyOffsetToSourceIndexes(offsetBefore); int offsetAfter; - if ((long)Math.abs(offsetBefore) + (long)manipulations.size() > Integer.MAX_VALUE) { // security belt for really huge collections or for collections that have been manipulated lots of times |