Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/CommitTransactionIndication.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/CommitTransactionIndication.java357
1 files changed, 66 insertions, 291 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/CommitTransactionIndication.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/CommitTransactionIndication.java
index 363ecb3dd4..6a36e48636 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/CommitTransactionIndication.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/CommitTransactionIndication.java
@@ -11,75 +11,41 @@
**************************************************************************/
package org.eclipse.emf.cdo.internal.server.protocol;
-import org.eclipse.emf.cdo.internal.protocol.model.CDOPackageImpl;
-import org.eclipse.emf.cdo.internal.protocol.revision.InternalCDORevision;
import org.eclipse.emf.cdo.internal.protocol.revision.delta.CDORevisionDeltaImpl;
-import org.eclipse.emf.cdo.internal.server.PackageManager;
-import org.eclipse.emf.cdo.internal.server.Repository;
-import org.eclipse.emf.cdo.internal.server.RevisionManager;
-import org.eclipse.emf.cdo.internal.server.View;
+import org.eclipse.emf.cdo.internal.server.Transaction;
+import org.eclipse.emf.cdo.internal.server.Transaction.TransactionPackageManager;
import org.eclipse.emf.cdo.internal.server.bundle.OM;
import org.eclipse.emf.cdo.protocol.CDOProtocolConstants;
import org.eclipse.emf.cdo.protocol.id.CDOID;
import org.eclipse.emf.cdo.protocol.id.CDOIDMetaRange;
-import org.eclipse.emf.cdo.protocol.id.CDOIDObjectFactory;
+import org.eclipse.emf.cdo.protocol.id.CDOIDTemp;
import org.eclipse.emf.cdo.protocol.id.CDOIDUtil;
import org.eclipse.emf.cdo.protocol.model.CDOModelUtil;
import org.eclipse.emf.cdo.protocol.model.CDOPackage;
-import org.eclipse.emf.cdo.protocol.model.CDOPackageManager;
-import org.eclipse.emf.cdo.protocol.model.core.CDOCorePackage;
-import org.eclipse.emf.cdo.protocol.model.resource.CDOResourcePackage;
+import org.eclipse.emf.cdo.protocol.revision.CDORevision;
+import org.eclipse.emf.cdo.protocol.revision.CDORevisionResolver;
import org.eclipse.emf.cdo.protocol.revision.CDORevisionUtil;
-import org.eclipse.emf.cdo.server.IStore;
-import org.eclipse.emf.cdo.server.IStoreWriter;
+import org.eclipse.emf.cdo.protocol.revision.delta.CDORevisionDelta;
+import org.eclipse.emf.cdo.server.IRepository;
import org.eclipse.emf.cdo.server.IView;
-import org.eclipse.emf.cdo.server.StoreUtil;
import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
-import org.eclipse.net4j.internal.util.transaction.Transaction;
-import org.eclipse.net4j.util.ImplementationError;
-import org.eclipse.net4j.util.ObjectUtil;
-import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.io.ExtendedDataInputStream;
import org.eclipse.net4j.util.io.ExtendedDataOutputStream;
-import org.eclipse.net4j.util.transaction.ITransaction;
import java.io.IOException;
-import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* @author Eike Stepper
*/
-@SuppressWarnings("unused")
public class CommitTransactionIndication extends CDOServerIndication
{
private static final ContextTracer PROTOCOL = new ContextTracer(OM.DEBUG_PROTOCOL, CommitTransactionIndication.class);
- private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_REVISION, CommitTransactionIndication.class);
-
- private CDOPackage[] newPackages;
-
- private InternalCDORevision[] newResources;
-
- private InternalCDORevision[] newObjects;
-
- private CDORevisionDeltaImpl[] dirtyObjects;
-
- private CDOID[] dirtyIDs;
-
- private Map<CDOID, CDOID> idMappings = new HashMap<CDOID, CDOID>();
-
- private long timeStamp;
-
- private PackageManager sessionPackageManager;
-
- private CDOPackageManager transactionPackageManager;
-
- private View view;
-
- private String rollbackMessage;
+ private Transaction transaction;
public CommitTransactionIndication()
{
@@ -94,305 +60,114 @@ public class CommitTransactionIndication extends CDOServerIndication
@Override
protected void indicating(ExtendedDataInputStream in) throws IOException
{
- timeStamp = System.currentTimeMillis();
- sessionPackageManager = getPackageManager();
- transactionPackageManager = new TransactionPackageManager();
+ IRepository repository = getRepository();
+ CDORevisionResolver revisionResolver = repository.getRevisionManager();
int viewID = in.readInt();
- view = getSession().getView(viewID);
- if (view == null || view.getViewType() != IView.Type.TRANSACTION)
- {
- throw new IllegalStateException("Illegal view: " + view);
- }
-
- IStore store = getStore();
- IStoreWriter storeWriter = store.getWriter(view);
-
- try
- {
- StoreUtil.setReader(storeWriter);
- newPackages = readNewPackages(in, storeWriter);
- newResources = readNewResources(in, storeWriter);
- newObjects = readNewObjects(in, storeWriter);
- dirtyObjects = readDirtyObjects(in, storeWriter);
- ITransaction<IStoreWriter> storeTransaction = new Transaction<IStoreWriter>(storeWriter, false);
+ transaction = getTransaction(viewID);
+ TransactionPackageManager packageManager = transaction.getPackageManager();
- try
- {
- addPackages(storeTransaction, newPackages);
- addRevisions(storeTransaction, newResources);
- addRevisions(storeTransaction, newObjects);
- writeRevisions(storeTransaction, dirtyObjects);
- // addRevisions(storeTransaction, dirtyObjects);
+ CDOPackage[] newPackages = new CDOPackage[in.readInt()];
+ CDORevision[] newResources = new CDORevision[in.readInt()];
+ CDORevision[] newObjects = new CDORevision[in.readInt()];
+ CDORevisionDelta[] dirtyObjectDeltas = new CDORevisionDelta[in.readInt()];
- storeWriter.commit();
- storeTransaction.commit();
- }
- catch (RuntimeException ex)
- {
- OM.LOG.error(ex);
- rollbackMessage = ex.getLocalizedMessage();
- storeWriter.rollback();
- storeTransaction.rollback();
- }
- }
- finally
- {
- storeWriter.release();
- StoreUtil.setReader(null);
- }
- }
-
- @Override
- protected void responding(ExtendedDataOutputStream out) throws IOException
- {
- if (rollbackMessage != null)
- {
- out.writeBoolean(false);
- out.writeString(rollbackMessage);
- }
- else
- {
- out.writeBoolean(true);
- out.writeLong(timeStamp);
- for (CDOPackage newPackage : newPackages)
- {
- CDOIDUtil.writeMetaRange(out, newPackage.getMetaIDRange());
- }
-
- writeIDMappings(out);
- if (dirtyIDs.length > 0)
- {
- getSessionManager().notifyInvalidation(timeStamp, dirtyIDs, getSession());
- }
- }
- }
-
- private CDOPackage[] readNewPackages(ExtendedDataInputStream in, IStoreWriter storeWriter) throws IOException
- {
- int size = in.readInt();
+ // New packages
if (PROTOCOL.isEnabled())
{
- PROTOCOL.format("Reading {0} new packages", size);
+ PROTOCOL.format("Reading {0} new packages", newPackages.length);
}
- Repository repository = getRepository();
- CDOPackage[] newPackages = new CDOPackage[size];
- for (int i = 0; i < size; i++)
+ for (int i = 0; i < newPackages.length; i++)
{
- newPackages[i] = CDOModelUtil.readPackage(transactionPackageManager, in);
- CDOIDMetaRange oldRange = newPackages[i].getMetaIDRange();
- if (oldRange != null && oldRange.isTemporary())
- {
- CDOIDMetaRange newRange = repository.getMetaIDRange(oldRange.size());
- ((CDOPackageImpl)newPackages[i]).setMetaIDRange(newRange);
-
- for (int l = 0; l < oldRange.size(); l++)
- {
- CDOID oldID = oldRange.get(l);
- CDOID newID = newRange.get(l);
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Mapping ID: {0} --> {1}", oldID, newID);
- }
-
- idMappings.put(oldID, newID);
- }
- }
+ newPackages[i] = CDOModelUtil.readPackage(packageManager, in);
+ packageManager.addPackage(newPackages[i]);
}
- return newPackages;
- }
-
- private InternalCDORevision[] readNewResources(ExtendedDataInputStream in, IStoreWriter storeWriter)
- throws IOException
- {
- int size = in.readInt();
+ // New resources
if (PROTOCOL.isEnabled())
{
- PROTOCOL.format("Reading {0} new resources", size);
+ PROTOCOL.format("Reading {0} new resources", newResources.length);
}
- return readRevisions(in, storeWriter, size);
- }
-
- private InternalCDORevision[] readNewObjects(ExtendedDataInputStream in, IStoreWriter storeWriter) throws IOException
- {
- int size = in.readInt();
- if (PROTOCOL.isEnabled())
+ for (int i = 0; i < newResources.length; i++)
{
- PROTOCOL.format("Reading {0} new objects", size);
+ newResources[i] = CDORevisionUtil.read(in, revisionResolver, packageManager);
}
- return readRevisions(in, storeWriter, size);
- }
-
- private CDORevisionDeltaImpl[] readDirtyObjects(ExtendedDataInputStream in, IStoreWriter storeWriter)
- throws IOException
- {
- int size = in.readInt();
+ // New objects
if (PROTOCOL.isEnabled())
{
- PROTOCOL.format("Reading {0} dirty objects", size);
+ PROTOCOL.format("Reading {0} new objects", newObjects.length);
}
- RevisionManager revisionManager = sessionPackageManager.getRepository().getRevisionManager();
- CDORevisionDeltaImpl[] deltas = new CDORevisionDeltaImpl[size];
- dirtyIDs = new CDOID[size];
- for (int i = 0; i < size; i++)
+ for (int i = 0; i < newObjects.length; i++)
{
- deltas[i] = new CDORevisionDeltaImpl(in, transactionPackageManager);
- dirtyIDs[i] = deltas[i].getID();
+ newObjects[i] = CDORevisionUtil.read(in, revisionResolver, packageManager);
}
- return deltas;
- }
-
- private InternalCDORevision[] readRevisions(ExtendedDataInputStream in, IStoreWriter storeWriter, int size)
- throws IOException
- {
- RevisionManager revisionManager = sessionPackageManager.getRepository().getRevisionManager();
- InternalCDORevision[] revisions = new InternalCDORevision[size];
- for (int i = 0; i < size; i++)
+ // Dirty objects
+ if (PROTOCOL.isEnabled())
{
- revisions[i] = (InternalCDORevision)CDORevisionUtil.read(in, revisionManager, transactionPackageManager);
- mapTemporaryID(revisions[i], storeWriter);
+ PROTOCOL.format("Reading {0} dirty object deltas", dirtyObjectDeltas.length);
}
- return revisions;
- }
-
- // TODO Remove newPackages parameter
- private void addPackages(ITransaction<IStoreWriter> storeTransaction, CDOPackage[] newPackages)
- {
- sessionPackageManager.addPackages(storeTransaction, newPackages);
- }
-
- private void addRevisions(ITransaction<IStoreWriter> storeTransaction, InternalCDORevision[] revisions)
- {
- RevisionManager revisionManager = getRevisionManager();
- for (InternalCDORevision revision : revisions)
+ for (int i = 0; i < dirtyObjectDeltas.length; i++)
{
- revision.setCreated(timeStamp);
- revision.adjustReferences(idMappings);
- revisionManager.addRevision(storeTransaction, revision);
+ dirtyObjectDeltas[i] = new CDORevisionDeltaImpl(in, packageManager);
}
- }
- // TODO Rename to addRevisionDeltas
- // TODO Remove deltas parameter
- private void writeRevisions(ITransaction<IStoreWriter> storeTransaction, CDORevisionDeltaImpl[] deltas)
- {
- for (CDORevisionDeltaImpl delta : deltas)
- {
- delta.adjustReferences(idMappings);
- getRevisionManager().addRevisionDelta(storeTransaction, delta);
- }
+ transaction.commit(newPackages, newResources, newObjects, dirtyObjectDeltas);
}
- private void mapTemporaryID(InternalCDORevision revision, IStoreWriter storeWriter)
+ @Override
+ protected void responding(ExtendedDataOutputStream out) throws IOException
{
- CDOID oldID = revision.getID();
- if (oldID.isTemporary())
+ String rollbackMessage = transaction.getRollbackMessage();
+ boolean success = rollbackMessage == null;
+ out.writeBoolean(success);
+ if (success)
{
- CDOID newID = storeWriter.primeNewObject(revision.getCDOClass());
- if (newID == null || newID.isNull() || newID.isMeta() || newID.isTemporary())
- {
- throw new ImplementationError("Store writer returned bad CDOID " + newID);
- }
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Mapping ID: {0} --> {1}", oldID, newID);
- }
-
- idMappings.put(oldID, newID);
- revision.setID(newID);
- }
- }
+ out.writeLong(transaction.getTimeStamp());
- private void writeIDMappings(ExtendedDataOutputStream out) throws IOException
- {
- for (Entry<CDOID, CDOID> entry : idMappings.entrySet())
- {
- CDOID oldID = entry.getKey();
- if (!oldID.isMeta())
+ // Meta ID ranges
+ List<CDOIDMetaRange> metaRanges = transaction.getMetaIDRanges();
+ for (CDOIDMetaRange metaRange : metaRanges)
{
- CDOID newID = entry.getValue();
- CDOIDUtil.write(out, oldID);
- CDOIDUtil.write(out, newID);
+ CDOIDUtil.writeMetaRange(out, metaRange);
}
- }
-
- CDOIDUtil.write(out, CDOID.NULL);
- }
- /**
- * @author Eike Stepper
- */
- private final class TransactionPackageManager implements CDOPackageManager
- {
- public TransactionPackageManager()
- {
- }
-
- public CDOIDObjectFactory getCDOIDObjectFactory()
- {
- return sessionPackageManager.getCDOIDObjectFactory();
- }
-
- public CDOPackage lookupPackage(String uri)
- {
- for (CDOPackage cdoPackage : newPackages)
+ // ID mappings
+ Map<CDOIDTemp, CDOID> idMappings = transaction.getIdMappings();
+ for (Entry<CDOIDTemp, CDOID> entry : idMappings.entrySet())
{
- if (ObjectUtil.equals(cdoPackage.getPackageURI(), uri))
+ CDOIDTemp oldID = entry.getKey();
+ if (!oldID.isMeta())
{
- return cdoPackage;
+ CDOID newID = entry.getValue();
+ CDOIDUtil.write(out, oldID);
+ CDOIDUtil.write(out, newID);
}
}
- return sessionPackageManager.lookupPackage(uri);
+ CDOIDUtil.write(out, CDOID.NULL);
}
-
- public CDOCorePackage getCDOCorePackage()
- {
- throw new UnsupportedOperationException();
- }
-
- public CDOResourcePackage getCDOResourcePackage()
- {
- throw new UnsupportedOperationException();
- }
-
- public int getPackageCount()
- {
- throw new UnsupportedOperationException();
- }
-
- public CDOPackage[] getPackages()
- {
- throw new UnsupportedOperationException();
- }
-
- public CDOPackage[] getElements()
+ else
{
- throw new UnsupportedOperationException();
+ out.writeString(rollbackMessage);
}
- public boolean isEmpty()
- {
- throw new UnsupportedOperationException();
- }
+ transaction.postCommit(success);
+ }
- public void addListener(IListener listener)
+ private Transaction getTransaction(int viewID)
+ {
+ IView view = getSession().getView(viewID);
+ if (view instanceof Transaction)
{
- throw new UnsupportedOperationException();
+ return (Transaction)view;
}
- public void removeListener(IListener listener)
- {
- throw new UnsupportedOperationException();
- }
+ throw new IllegalStateException("Illegal transaction: " + view);
}
}

Back to the top