Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java53
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

Back to the top