You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2012/03/24 15:01:52 UTC

svn commit: r1304796 [10/16] - in /incubator/isis/trunk/framework: applib/src/main/java/org/apache/isis/applib/ applib/src/test/java/org/apache/isis/applib/ core/commons/src/main/java/org/apache/isis/core/commons/config/ core/commons/src/main/java/org/...

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerPersist.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerPersist.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerPersist.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerPersist.java Sat Mar 24 14:01:35 2012
@@ -19,11 +19,11 @@
 
 package org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager;
 
+import org.apache.isis.applib.annotation.Aggregated;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ResolveState;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.runtimes.dflt.runtime.system.persistence.AdapterManager;
-import org.apache.isis.runtimes.dflt.runtime.system.persistence.OidGenerator;
+import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.algorithm.PersistAlgorithm;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
 
 /**
@@ -32,25 +32,19 @@ import org.apache.isis.runtimes.dflt.run
 public interface AdapterManagerPersist {
 
     /**
-     * Remaps the {@link ObjectAdapter adapter} and any associated aggregated
-     * (collection) adapters using a new value for the {@link Oid} provided by
-     * the {@link OidGenerator}.
+     * Remaps the {@link ObjectAdapter adapter} and any associated 
+     * (collection) adapters (ie, those that wrap the List/Set instances).
      * 
      * <p>
-     * The {@link Oid} of the supplied {@link ObjectAdapter adapter} should be
-     * in such a state that it can be
-     * {@link OidGenerator#convertTransientToPersistentOid(Oid) converted from
-     * transient to persistent}. Note that some {@link Oid} implementations
-     * require an initial state call to do this (eg to read from a database
-     * identity or sequence value).
+     * Note that it isn't necessary to remap any aggregated adapters (as per
+     * {@link Aggregated} annotation; the {@link PersistAlgorithm} calls this
+     * method and takes responsibility for locating the graph of transient
+     * objects that needs to be remapped.
      * 
      * <p>
-     * The adapter is remapped in the {@link AdapterManager}, and the
-     * {@link Oid#getPrevious() previous} is set to its transient value).
-     * Similarly for any aggregated adapters. This is needed for client/server
-     * so that the client can remap a changed object.
-     * 
-     * @see AdapterManagerProxy#remapUpdated(Oid)
+     * As a consequence of this call, the adapter's {@link Oid} will be
+     * {@link ObjectAdapter#replaceOid(Oid) replaced} (Oids are now immutable).
+     * The same is true of the associated collection adapters.
      */
     void remapAsPersistent(ObjectAdapter adapter);
 
@@ -70,6 +64,6 @@ public interface AdapterManagerPersist {
      * {@link ResolveState} will be {@link ResolveState#GHOST} if a persistent
      * {@link Oid}, or {@link ResolveState#TRANSIENT} otherwise.
      */
-    ObjectAdapter recreateRootAdapter(Oid oid, Object pojo);
+    ObjectAdapter recreateAdapter(Oid oid, Object pojo);
 
 }

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerProxy.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerProxy.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerProxy.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerProxy.java Sat Mar 24 14:01:35 2012
@@ -25,7 +25,10 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
 
 /**
- * API used solely by the {@link PersistenceSession}.
+ * API used solely by the {@link PersistenceSession}, for remoting support.
+ * 
+ * <p>
+ * *** THIS INTERFACE IS NO LONGER IMPLEMENTED, SINCE REMOTING SUPPORT HAS BEEN REMOVED. ***
  */
 public interface AdapterManagerProxy extends ObjectAdapterLookup {
 
@@ -40,6 +43,6 @@ public interface AdapterManagerProxy ext
      * 
      * @see AdapterManagerPersist#remapAsPersistent(ObjectAdapter)
      */
-    public void remapUpdated(Oid oid);
+    public void remapUpdated(Oid rootOid);
 
 }

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerTestSupport.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerTestSupport.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerTestSupport.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerTestSupport.java Sat Mar 24 14:01:35 2012
@@ -21,28 +21,29 @@ package org.apache.isis.runtimes.dflt.ru
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 
 public interface AdapterManagerTestSupport {
 
     /**
      * For testing purposes, creates an {@link ObjectAdapter adapter} for the
-     * supplied domain object with the specified {@link Oid}.
+     * supplied domain object with the specified {@link RootOid}
      * 
      * <p>
      * The usual way of creating {@link ObjectAdapter adapter}s is using
      * {@link #adapterFor(Object)}, using the <tt>OidGenerator</tt> to obtain an
-     * {@link Oid}. This test-support method differs because it allows the
-     * {@link Oid} to be specified explicitly.
+     * {@link RootOid}. This test-support method differs because it allows the
+     * {@link RootOid} to be specified explicitly.
      * 
      * <p>
-     * Note that the {@link Oid} must represent a {@link Oid#isTransient()
+     * Note that the {@link RootOid} must represent a {@link Oid#isTransient()
      * transient} object. If an {@link ObjectAdapter adapter} is required for a
-     * persistent {@link Oid}, just use
-     * {@link #recreateRootAdapter(Object, Oid)}.
+     * persistent {@link RootOid}, just use
+     * {@link #recreateAdapter(Object, RootOid)}.
      * 
      * @see #adapterFor(Object)
-     * @see #recreateRootAdapter(Object, Oid)
+     * @see #recreateAdapter(Object, RootOid)
      */
-    ObjectAdapter testCreateTransient(Object pojo, Oid oid);
+    ObjectAdapter testCreateTransient(Object pojo, RootOid oid);
 
 }

Copied: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/RootAndCollectionAdapters.java (from r1301918, incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AggregateAdapters.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/RootAndCollectionAdapters.java?p2=incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/RootAndCollectionAdapters.java&p1=incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AggregateAdapters.java&r1=1301918&r2=1304796&rev=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AggregateAdapters.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/RootAndCollectionAdapters.java Sat Mar 24 14:01:35 2012
@@ -21,36 +21,45 @@ package org.apache.isis.runtimes.dflt.ru
 
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
 
+import com.google.common.collect.Maps;
+
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterLookup;
+import org.apache.isis.core.metamodel.adapter.oid.CollectionOid;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 
-public class AggregateAdapters implements Iterable<ObjectAdapter> {
-
-    private final ObjectAdapter rootAdapter;
-    private final Map<OneToManyAssociation, ObjectAdapter> collectionAdapters = new LinkedHashMap<OneToManyAssociation, ObjectAdapter>();
-
-    public AggregateAdapters(final ObjectAdapter rootAdapter) {
-        Assert.assertNotNull(rootAdapter);
-        this.rootAdapter = rootAdapter;
+/**
+ * A root {@link ObjectAdapter adapter} along with aggregated {@link ObjectAdapter adapters}
+ * for any of its {@link OneToManyAssociation collection}s that are currently present in
+ * the {@link ObjectAdapterLookup map}s.
+ * 
+ * <p>
+ * Used for &quot;impact analysis&quot; when persisting transient root objects; all aggregated adapters
+ * must also be persisted.
+ */
+public class RootAndCollectionAdapters implements Iterable<ObjectAdapter> {
+
+    private final ObjectAdapter parentAdapter;
+    private final Oid rootAdapterOid;
+    
+    private final Map<OneToManyAssociation, ObjectAdapter> collectionAdapters = Maps.newLinkedHashMap();
+
+    public RootAndCollectionAdapters(ObjectAdapter parentAdapter, ObjectAdapterLookup objectAdapterLookup) {
+        Assert.assertNotNull(parentAdapter);
+        final Oid oid = parentAdapter.getOid();
+        this.parentAdapter = parentAdapter;
+        this.rootAdapterOid = (RootOid) oid;
+        addCollectionAdapters(objectAdapterLookup);
     }
 
     public ObjectAdapter getRootAdapter() {
-        return rootAdapter;
-    }
-
-    public void addCollectionAdapter(final OneToManyAssociation otma, final ObjectAdapter collectionAdapter) {
-        Assert.assertNotNull(otma);
-        Assert.assertNotNull(collectionAdapter);
-        collectionAdapters.put(otma, collectionAdapter);
-    }
-
-    public Map<OneToManyAssociation, ObjectAdapter> getCollectionAdapters() {
-        return Collections.unmodifiableMap(collectionAdapters);
+        return parentAdapter;
     }
 
     /**
@@ -64,11 +73,48 @@ public class AggregateAdapters implement
         return getCollectionAdapters().values().iterator();
     }
 
+    /**
+     * Which collections are present?
+     * @return
+     */
     public Set<OneToManyAssociation> getCollections() {
         return getCollectionAdapters().keySet();
     }
 
+    /**
+     * Corresponding adapter for each collection (values).
+     * 
+     * @see #getCollections()
+     */
     public ObjectAdapter getCollectionAdapter(final OneToManyAssociation otma) {
         return collectionAdapters.get(otma);
     }
+
+    
+    ////////////////////////////////////////////////////////////////////////
+    // Helpers
+    ////////////////////////////////////////////////////////////////////////
+
+    private void addCollectionAdapters(ObjectAdapterLookup objectAdapterLookup) {
+        for (final OneToManyAssociation otma : parentAdapter.getSpecification().getCollections()) {
+            final CollectionOid collectionOid = new CollectionOid(rootAdapterOid, otma);
+            final ObjectAdapter collectionAdapter = objectAdapterLookup.getAdapterFor(collectionOid);
+            if (collectionAdapter != null) {
+                // collection adapters are lazily created and so there may not be one.
+                addCollectionAdapter(otma, collectionAdapter);
+            }
+        }
+    }
+
+    private void addCollectionAdapter(final OneToManyAssociation otma, final ObjectAdapter collectionAdapter) {
+        Assert.assertNotNull(otma);
+        Assert.assertNotNull(collectionAdapter);
+        collectionAdapters.put(otma, collectionAdapter);
+    }
+
+    private Map<OneToManyAssociation, ObjectAdapter> getCollectionAdapters() {
+        return Collections.unmodifiableMap(collectionAdapters);
+    }
+
+
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/internal/OidAdapterHashMap.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/internal/OidAdapterHashMap.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/internal/OidAdapterHashMap.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/internal/OidAdapterHashMap.java Sat Mar 24 14:01:35 2012
@@ -19,10 +19,11 @@
 
 package org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager.internal;
 
-import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.Map;
 
+import com.google.common.collect.Maps;
+
 import org.apache.log4j.Logger;
 
 import org.apache.isis.core.commons.debug.DebugBuilder;
@@ -33,21 +34,10 @@ import org.apache.isis.core.metamodel.sp
 public class OidAdapterHashMap implements OidAdapterMap {
 
     private static final Logger LOG = Logger.getLogger(OidAdapterHashMap.class);
-    private static final int DEFAULT_OID_ADAPTER_MAP_SIZE = 10;
+    public static final int DEFAULT_OID_ADAPTER_MAP_SIZE = 100;
 
-    private final Hashtable<Oid, ObjectAdapter> adapterByOidMap;
+    private final Map<Oid, ObjectAdapter> adapterByOidMap = Maps.newHashMapWithExpectedSize(DEFAULT_OID_ADAPTER_MAP_SIZE);
 
-    // ///////////////////////////////////////////////////////
-    // Constructors
-    // ///////////////////////////////////////////////////////
-
-    public OidAdapterHashMap() {
-        this(DEFAULT_OID_ADAPTER_MAP_SIZE);
-    }
-
-    public OidAdapterHashMap(final int capacity) {
-        adapterByOidMap = new Hashtable<Oid, ObjectAdapter>(capacity);
-    }
 
     // ///////////////////////////////////////////////////////
     // open, close
@@ -109,6 +99,7 @@ public class OidAdapterHashMap implement
         return adapterByOidMap.remove(oid) != null;
     }
 
+
     // ///////////////////////////////////////////////////////
     // getAdapter
     // ///////////////////////////////////////////////////////
@@ -149,4 +140,5 @@ public class OidAdapterHashMap implement
         }
     }
 
+
 }

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/internal/OidAdapterMap.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/internal/OidAdapterMap.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/internal/OidAdapterMap.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/internal/OidAdapterMap.java Sat Mar 24 14:01:35 2012
@@ -42,9 +42,11 @@ public interface OidAdapterMap extends D
      */
     public boolean remove(final Oid oid);
 
+
     /**
      * Get the adapter identified by the specified OID.
      */
     public ObjectAdapter getAdapter(final Oid oid);
 
+
 }

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/internal/PojoAdapterHashMap.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/internal/PojoAdapterHashMap.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/internal/PojoAdapterHashMap.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/internal/PojoAdapterHashMap.java Sat Mar 24 14:01:35 2012
@@ -23,6 +23,8 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
+import com.google.common.collect.Maps;
+
 import org.apache.commons.collections.map.IdentityMap;
 import org.apache.log4j.Logger;
 
@@ -54,7 +56,7 @@ public class PojoAdapterHashMap implemen
     }
 
     private static final Logger LOG = Logger.getLogger(PojoAdapterHashMap.class);
-    public static final int DEFAULT_POJO_ADAPTER_MAP_SIZE = 10;
+    public static final int DEFAULT_POJO_ADAPTER_MAP_SIZE = OidAdapterHashMap.DEFAULT_OID_ADAPTER_MAP_SIZE;
 
     protected final Map<Object, ObjectAdapter> adapterByPojoMap;
 
@@ -67,8 +69,7 @@ public class PojoAdapterHashMap implemen
     }
 
     public PojoAdapterHashMap(final int capacity) {
-        adapterByPojoMap = new HashMap<Object, ObjectAdapter>(capacity);
-        // adapterByPojoMap = new IdentityMap(capacity);
+        adapterByPojoMap = Maps.newHashMapWithExpectedSize(capacity);
     }
 
     @Override
@@ -115,7 +116,9 @@ public class PojoAdapterHashMap implemen
     @Override
     public void add(final Object pojo, final ObjectAdapter adapter) {
         adapterByPojoMap.put(key(pojo), adapter);
-        LOG.debug("add adapter: #" + Long.toHexString(pojo.hashCode()) + " -> #" + Long.toHexString(adapter.hashCode()));
+        if(LOG.isDebugEnabled()) {
+            LOG.debug("add adapter: #" + Long.toHexString(pojo.hashCode()) + " -> #" + Long.toHexString(adapter.hashCode()));
+        }
         // log at end so that if toString needs adapters they're in maps.
         if (adapter.getResolveState().isResolved()) {
             if (LOG.isDebugEnabled()) {
@@ -126,7 +129,9 @@ public class PojoAdapterHashMap implemen
 
     @Override
     public void remove(final ObjectAdapter object) {
-        LOG.debug("remove adapater: " + object);
+        if(LOG.isDebugEnabled()) {
+            LOG.debug("remove adapter: " + object);
+        }
         adapterByPojoMap.remove(key(object.getObject()));
     }
 

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/internal/RuntimeContextFromSession.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/internal/RuntimeContextFromSession.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/internal/RuntimeContextFromSession.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/internal/RuntimeContextFromSession.java Sat Mar 24 14:01:35 2012
@@ -51,6 +51,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.core.metamodel.spec.ObjectInstantiator;
 import org.apache.isis.core.metamodel.spec.ObjectInstantiatorAbstract;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.runtimes.dflt.runtime.persistence.container.DomainObjectContainerObjectChanged;
 import org.apache.isis.runtimes.dflt.runtime.persistence.container.DomainObjectContainerResolve;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
@@ -103,13 +104,13 @@ public class RuntimeContextFromSession e
             }
 
             @Override
-            public ObjectAdapter adapterForAggregated(final Object domainObject, final ObjectAdapter parent) {
-                return getRuntimeAdapterManager().adapterForAggregated(domainObject, parent);
-            };
+            public ObjectAdapter adapterFor(final Object pojo, final ObjectAdapter ownerAdapter) {
+                return getRuntimeAdapterManager().adapterFor(pojo, ownerAdapter);
+            }
 
             @Override
-            public ObjectAdapter adapterFor(final Object pojo, final ObjectAdapter ownerAdapter, final IdentifiedHolder identifiedHolder) {
-                return getRuntimeAdapterManager().adapterFor(pojo, ownerAdapter, identifiedHolder);
+            public ObjectAdapter adapterFor(final Object pojo, final ObjectAdapter ownerAdapter, final ObjectAssociation association) {
+                return getRuntimeAdapterManager().adapterFor(pojo, ownerAdapter, association);
             }
         };
         this.objectInstantiator = new ObjectInstantiatorAbstract() {
@@ -159,7 +160,7 @@ public class RuntimeContextFromSession e
 
             @Override
             public ObjectAdapter createAggregatedInstance(final ObjectSpecification spec, final ObjectAdapter parent) {
-                return getPersistenceSession().createAggregatedInstance(spec, parent);
+                return getPersistenceSession().createInstance(spec, parent);
             };
 
             @Override

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/IsisStoreDelegating.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/IsisStoreDelegating.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/IsisStoreDelegating.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/IsisStoreDelegating.java Sat Mar 24 14:01:35 2012
@@ -24,6 +24,7 @@ import java.util.List;
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.CreateObjectCommand;
@@ -166,13 +167,13 @@ public abstract class IsisStoreDelegatin
     // ////////////////////////////////////////////////
 
     @Override
-    public Oid getOidForService(ObjectSpecification serviceSpecification, final String name) {
-        return underlying.getOidForService(serviceSpecification, name);
+    public RootOid getOidForService(ObjectSpecification serviceSpecification) {
+        return underlying.getOidForService(serviceSpecification);
     }
 
     @Override
-    public void registerService(final String name, final Oid oid) {
-        underlying.registerService(name, oid);
+    public void registerService(final RootOid rootOid) {
+        underlying.registerService(rootOid);
     }
 
     // ////////////////////////////////////////////////

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/IsisStoreLogger.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/IsisStoreLogger.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/IsisStoreLogger.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/IsisStoreLogger.java Sat Mar 24 14:01:35 2012
@@ -26,6 +26,7 @@ import org.apache.isis.core.commons.debu
 import org.apache.isis.core.commons.factory.InstanceCreationException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.runtime.logging.Logger;
@@ -57,9 +58,9 @@ public class IsisStoreLogger extends Log
     }
 
     @Override
-    public void registerService(final String name, final Oid oid) {
-        log("register service " + name + " as " + oid);
-        decorated.registerService(name, oid);
+    public void registerService(final RootOid rootOid) {
+        log("registering service: " + rootOid.enString());
+        decorated.registerService(rootOid);
     }
 
     @Override
@@ -103,10 +104,10 @@ public class IsisStoreLogger extends Log
     }
 
     @Override
-    public Oid getOidForService(ObjectSpecification serviceSpecification, final String name) {
-        final Oid oid = decorated.getOidForService(serviceSpecification, name);
-        log("get OID for service " + name + ": " + oid);
-        return oid;
+    public RootOid getOidForService(ObjectSpecification serviceSpec) {
+        final RootOid serviceOid = decorated.getOidForService(serviceSpec);
+        log("get OID for service: " + serviceOid.enString());
+        return serviceOid;
     }
 
     @Override

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/ObjectStorePersistence.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/ObjectStorePersistence.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/ObjectStorePersistence.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/ObjectStorePersistence.java Sat Mar 24 14:01:35 2012
@@ -21,10 +21,13 @@ package org.apache.isis.runtimes.dflt.ru
 
 import java.util.List;
 
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.components.SessionScopedComponent;
+import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.debug.DebuggableWithTitle;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.runtimes.dflt.runtime.persistence.ObjectNotFoundException;
@@ -48,7 +51,7 @@ public interface ObjectStorePersistence 
      * up objects.
      * 
      * <p>
-     * This method is called only once after the {@link #init()} has been
+     * This method is called only once after the {@link #openSession(TestProxyReflector, IsisConfiguration, TestProxyPersistenceSessionFactory, TestProxyPersistenceSession, TestUserProfileStore, AuthenticationSession)} has been
      * called. If it returns <code>false</code> then the framework will run the
      * fixtures to initialise the object store.
      */
@@ -186,12 +189,11 @@ public interface ObjectStorePersistence 
     // Services
     // ///////////////////////////////////////////////////////
 
-    void registerService(String id, Oid oid);
+    void registerService(RootOid rootOid);
 
     /**
      * Returns the OID for the adapted service.
-     * @param serviceSpecification TODO
      */
-    Oid getOidForService(ObjectSpecification serviceSpecification, String id);
+    RootOid getOidForService(ObjectSpecification serviceSpec);
 
 }

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/PersistenceSessionObjectStore.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/PersistenceSessionObjectStore.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/PersistenceSessionObjectStore.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/PersistenceSessionObjectStore.java Sat Mar 24 14:01:35 2012
@@ -26,9 +26,10 @@ import static org.hamcrest.CoreMatchers.
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.CoreMatchers.nullValue;
 
-import java.util.HashMap;
 import java.util.Map;
 
+import com.google.common.collect.Maps;
+
 import org.apache.log4j.Logger;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
@@ -39,6 +40,7 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory;
 import org.apache.isis.core.metamodel.adapter.ResolveState;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.facets.object.callbacks.CallbackUtils;
 import org.apache.isis.core.metamodel.facets.object.callbacks.LoadedCallbackFacet;
 import org.apache.isis.core.metamodel.facets.object.callbacks.LoadingCallbackFacet;
@@ -75,7 +77,7 @@ public class PersistenceSessionObjectSto
     private static final Logger LOG = Logger.getLogger(PersistenceSessionObjectStore.class);
     private final PersistAlgorithm persistAlgorithm;
     private final ObjectStorePersistence objectStore;
-    private final Map<String, Oid> services = new HashMap<String, Oid>();
+    private final Map<String, RootOid> servicesByObjectType = Maps.newHashMap();
 
     /**
      * Initialize the object store so that calls to this object store access
@@ -345,7 +347,7 @@ public class PersistenceSessionObjectSto
     @Override
     public void objectChanged(final ObjectAdapter adapter) {
 
-        if (adapter.isTransient() || (adapter.isAggregated() && adapter.getAggregateRoot().isTransient())) {
+        if (adapter.isTransient() || (adapter.isParented() && adapter.getAggregateRoot(getAdapterManager()).isTransient())) {
             addObjectChangedForPresentationLayer(adapter);
             return;
         }
@@ -540,22 +542,23 @@ public class PersistenceSessionObjectSto
     // ///////////////////////////////////////////////////////////////////////////
 
     @Override
-    protected Oid getOidForService(ObjectSpecification serviceSpecification, final String name) {
-        return getOidForServiceFromPersistenceLayer(serviceSpecification, name);
+    protected RootOid getOidForService(ObjectSpecification serviceSpec) {
+        return getOidForServiceFromPersistenceLayer(serviceSpec);
     }
 
-    private Oid getOidForServiceFromPersistenceLayer(ObjectSpecification serviceSpecification, final String name) {
-        Oid oid = services.get(name);
+    private RootOid getOidForServiceFromPersistenceLayer(ObjectSpecification serviceSpecification) {
+        final String objectType = serviceSpecification.getObjectType();
+        RootOid oid = servicesByObjectType.get(objectType);
         if (oid == null) {
-            oid = objectStore.getOidForService(serviceSpecification, name);
-            services.put(name, oid);
+            oid = objectStore.getOidForService(serviceSpecification);
+            servicesByObjectType.put(objectType, oid);
         }
         return oid;
     }
 
     @Override
-    protected void registerService(final String name, final Oid oid) {
-        objectStore.registerService(name, oid);
+    protected void registerService(final RootOid rootOid) {
+        objectStore.registerService(rootOid);
     }
 
     // ///////////////////////////////////////////////////////////////////////////

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/PersistAlgorithm.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/PersistAlgorithm.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/PersistAlgorithm.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/PersistAlgorithm.java Sat Mar 24 14:01:35 2012
@@ -22,6 +22,7 @@ package org.apache.isis.runtimes.dflt.ru
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 
 public interface PersistAlgorithm {
+    
     public void makePersistent(final ObjectAdapter object, final ToPersistObjectSet adders);
 
     public String name();

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/PersistAlgorithmAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/PersistAlgorithmAbstract.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/PersistAlgorithmAbstract.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/PersistAlgorithmAbstract.java Sat Mar 24 14:01:35 2012
@@ -90,7 +90,7 @@ public abstract class PersistAlgorithmAb
     }
 
     private boolean objectSpecNotPersistable(final ObjectAdapter adapter) {
-        return !adapter.getSpecification().persistability().isPersistable() || adapter.isAggregated();
+        return !adapter.getSpecification().persistability().isPersistable() || adapter.isParented();
     }
 
     private boolean objectSpecIsService(final ObjectAdapter adapter) {

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/dflt/DefaultPersistAlgorithm.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/dflt/DefaultPersistAlgorithm.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/dflt/DefaultPersistAlgorithm.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/dflt/DefaultPersistAlgorithm.java Sat Mar 24 14:01:35 2012
@@ -45,22 +45,24 @@ public class DefaultPersistAlgorithm ext
     }
 
     @Override
-    public void makePersistent(final ObjectAdapter object, final ToPersistObjectSet toPersistObjectSet) {
-        if (object.getSpecification().isCollection()) {
-            LOG.debug("persist " + object);
-            if (object.getResolveState() == ResolveState.GHOST) {
-                object.changeState(ResolveState.RESOLVING);
-                object.changeState(ResolveState.RESOLVED);
-            } else if (object.getResolveState() == ResolveState.TRANSIENT) {
-                object.changeState(ResolveState.RESOLVED);
+    public void makePersistent(final ObjectAdapter adapter, final ToPersistObjectSet toPersistObjectSet) {
+        if (adapter.getSpecification().isCollection()) {
+            if(LOG.isDebugEnabled()) {
+                LOG.debug("persist " + adapter);
             }
-            final CollectionFacet facet = CollectionFacetUtils.getCollectionFacetFromSpec(object);
-            for (final ObjectAdapter element : facet.iterable(object)) {
+            if (adapter.getResolveState() == ResolveState.GHOST) {
+                adapter.changeState(ResolveState.RESOLVING);
+                adapter.changeState(ResolveState.RESOLVED);
+            } else if (adapter.getResolveState() == ResolveState.TRANSIENT) {
+                adapter.changeState(ResolveState.RESOLVED);
+            }
+            final CollectionFacet facet = CollectionFacetUtils.getCollectionFacetFromSpec(adapter);
+            for (final ObjectAdapter element : facet.iterable(adapter)) {
                 persist(element, toPersistObjectSet);
             }
         } else {
-            assertObjectNotPersistentAndPersistable(object);
-            persist(object, toPersistObjectSet);
+            assertObjectNotPersistentAndPersistable(adapter);
+            persist(adapter, toPersistObjectSet);
         }
     }
 
@@ -71,7 +73,9 @@ public class DefaultPersistAlgorithm ext
 
         final List<ObjectAssociation> fields = object.getSpecification().getAssociations();
         if (!object.getSpecification().isEncodeable() && fields.size() > 0) {
-            LOG.debug("make persistent " + object);
+            if(LOG.isDebugEnabled()) {
+                LOG.debug("make persistent " + object);
+            }
             CallbackUtils.callCallback(object, PersistingCallbackFacet.class);
             toPersistObjectSet.remapAsPersistent(object);
             object.changeState(ResolveState.SERIALIZING_RESOLVED);

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/topdown/TopDownPersistAlgorithm.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/topdown/TopDownPersistAlgorithm.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/topdown/TopDownPersistAlgorithm.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/algorithm/topdown/TopDownPersistAlgorithm.java Sat Mar 24 14:01:35 2012
@@ -39,6 +39,7 @@ import org.apache.isis.runtimes.dflt.run
 import org.apache.isis.runtimes.dflt.runtime.transaction.ObjectPersistenceException;
 
 public class TopDownPersistAlgorithm extends PersistAlgorithmAbstract {
+    
     private static final Logger LOG = Logger.getLogger(TopDownPersistAlgorithm.class);
 
     @Override

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/transaction/ObjectStoreTransaction.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/transaction/ObjectStoreTransaction.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/transaction/ObjectStoreTransaction.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/transaction/ObjectStoreTransaction.java Sat Mar 24 14:01:35 2012
@@ -19,35 +19,75 @@
 
 package org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction;
 
-import java.util.ArrayList;
+import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
+import static org.apache.isis.core.commons.ensure.Ensure.ensureThatState;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+
 import java.util.Collections;
 import java.util.List;
 
+import com.google.common.collect.Lists;
+
 import org.apache.log4j.Logger;
 
 import org.apache.isis.core.commons.lang.ToString;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ResolveState;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.ObjectStoreTransactionManagement;
+import org.apache.isis.runtimes.dflt.runtime.system.transaction.IsisTransaction;
 import org.apache.isis.runtimes.dflt.runtime.system.transaction.IsisTransactionManager;
 import org.apache.isis.runtimes.dflt.runtime.system.transaction.MessageBroker;
 import org.apache.isis.runtimes.dflt.runtime.system.transaction.UpdateNotifier;
-import org.apache.isis.runtimes.dflt.runtime.transaction.IsisTransactionAbstract;
 
-public class ObjectStoreTransaction extends IsisTransactionAbstract {
+public class ObjectStoreTransaction implements IsisTransaction {
+    
     private static final Logger LOG = Logger.getLogger(ObjectStoreTransaction.class);
 
     private final ObjectStoreTransactionManagement objectStore;
-    private final List<PersistenceCommand> commands = new ArrayList<PersistenceCommand>();
+    private final List<PersistenceCommand> commands = Lists.newArrayList();
+    private final IsisTransactionManager transactionManager;
+    private final MessageBroker messageBroker;
+    private final UpdateNotifier updateNotifier;
+
+    private State state;
+
+    private RuntimeException cause;
 
     public ObjectStoreTransaction(final IsisTransactionManager transactionManager, final MessageBroker messageBroker, final UpdateNotifier updateNotifier, final ObjectStoreTransactionManagement objectStore) {
-        super(transactionManager, messageBroker, updateNotifier);
+        
+        ensureThatArg(transactionManager, is(not(nullValue())), "transaction manager is required");
+        ensureThatArg(messageBroker, is(not(nullValue())), "message broker is required");
+        ensureThatArg(updateNotifier, is(not(nullValue())), "update notifier is required");
+
+        this.transactionManager = transactionManager;
+        this.messageBroker = messageBroker;
+        this.updateNotifier = updateNotifier;
+
+        this.state = State.IN_PROGRESS;
+
         this.objectStore = objectStore;
         if (LOG.isDebugEnabled()) {
             LOG.debug("new transaction " + this);
         }
     }
 
+    // ////////////////////////////////////////////////////////////////
+    // State
+    // ////////////////////////////////////////////////////////////////
+
+    @Override
+    public State getState() {
+        return state;
+    }
+
+    private void setState(final State state) {
+        this.state = state;
+    }
+
+
+    
     // //////////////////////////////////////////////////////////
     // Commands
     // //////////////////////////////////////////////////////////
@@ -111,20 +151,51 @@ public class ObjectStoreTransaction exte
         commands.add(command);
     }
 
-    // //////////////////////////////////////////////////////////
-    // abort
-    // //////////////////////////////////////////////////////////
 
-    @Override
-    public void doAbort() {
-    }
 
-    // //////////////////////////////////////////////////////////
-    // commit
-    // //////////////////////////////////////////////////////////
+    // ////////////////////////////////////////////////////////////////
+    // flush
+    // ////////////////////////////////////////////////////////////////
 
-    @Override
-    public void doFlush() {
+    public final void flush() {
+        ensureThatState(getState().canFlush(), is(true), "state is: " + getState());
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("flush transaction " + this);
+        }
+
+        try {
+            doFlush();
+        } catch (final RuntimeException ex) {
+            setState(State.MUST_ABORT);
+            setAbortCause(ex);
+            throw ex;
+        }
+    }
+
+    /**
+     * Mandatory hook method for subclasses to persist all pending changes.
+     * 
+     * <p>
+     * Called by both {@link #commit()} and by {@link #flush()}:
+     * <table>
+     * <tr>
+     * <th>called from</th>
+     * <th>next {@link #getState() state} if ok</th>
+     * <th>next {@link #getState() state} if exception</th>
+     * </tr>
+     * <tr>
+     * <td>{@link #commit()}</td>
+     * <td>{@link State#COMMITTED}</td>
+     * <td>{@link State#ABORTED}</td>
+     * </tr>
+     * <tr>
+     * <td>{@link #flush()}</td>
+     * <td>{@link State#IN_PROGRESS}</td>
+     * <td>{@link State#MUST_ABORT}</td>
+     * </tr>
+     * </table>
+     */
+    private void doFlush() {
 
         if (commands.size() > 0) {
             objectStore.execute(Collections.unmodifiableList(commands));
@@ -132,7 +203,7 @@ public class ObjectStoreTransaction exte
             for (final PersistenceCommand command : commands) {
                 if (command instanceof DestroyObjectCommand) {
                     final ObjectAdapter adapter = command.onObject();
-                    adapter.setOptimisticLock(null);
+                    adapter.setVersion(null);
                     adapter.changeState(ResolveState.DESTROYED);
                 }
             }
@@ -140,6 +211,69 @@ public class ObjectStoreTransaction exte
         }
     }
 
+
+    
+    // ////////////////////////////////////////////////////////////////
+    // commit
+    // ////////////////////////////////////////////////////////////////
+
+    public final void commit() {
+        ensureThatState(getState().canCommit(), is(true), "state is: " + getState());
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("commit transaction " + this);
+        }
+
+        if (getState() == State.COMMITTED) {
+            if (LOG.isInfoEnabled()) {
+                LOG.info("already committed; ignoring");
+            }
+            return;
+        }
+        
+        try {
+            doFlush();
+            setState(State.COMMITTED);
+        } catch (final RuntimeException ex) {
+            setAbortCause(ex);
+            throw ex;
+        }
+    }
+
+    
+    // ////////////////////////////////////////////////////////////////
+    // abort
+    // ////////////////////////////////////////////////////////////////
+
+    public final void abort() {
+        ensureThatState(getState().canAbort(), is(true), "state is: " + getState());
+        if (LOG.isInfoEnabled()) {
+            LOG.info("abort transaction " + this);
+        }
+
+        setState(State.ABORTED);
+    }
+
+    
+
+    protected void setAbortCause(final RuntimeException cause) {
+        this.cause = cause;
+    }
+
+    /**
+     * The cause (if any) for the transaction being aborted.
+     * 
+     * <p>
+     * There will be a cause if an exception is thrown either by
+     * {@link #doFlush()} or {@link #doAbort()}.
+     */
+    @Override
+    public RuntimeException getAbortCause() {
+        return cause;
+    }
+
+    
+    
     // //////////////////////////////////////////////////////////
     // Helpers
     // //////////////////////////////////////////////////////////
@@ -184,11 +318,49 @@ public class ObjectStoreTransaction exte
         removeCommand(SaveObjectCommand.class, onObject);
     }
 
+    // ////////////////////////////////////////////////////////////////
+    // toString
+    // ////////////////////////////////////////////////////////////////
+
     @Override
+    public String toString() {
+        return appendTo(new ToString(this)).toString();
+    }
+
     protected ToString appendTo(final ToString str) {
-        super.appendTo(str);
+        str.append("state", state);
         str.append("commands", commands.size());
         return str;
     }
 
+
+    // ////////////////////////////////////////////////////////////////
+    // Depenendencies (from constructor)
+    // ////////////////////////////////////////////////////////////////
+
+    /**
+     * Injected in constructor
+     */
+    @Override
+    public IsisTransactionManager getTransactionManager() {
+        return transactionManager;
+    }
+
+    /**
+     * Injected in constructor
+     */
+    @Override
+    public MessageBroker getMessageBroker() {
+        return messageBroker;
+    }
+
+    /**
+     * Injected in constructor
+     */
+    @Override
+    public UpdateNotifier getUpdateNotifier() {
+        return updateNotifier;
+    }
+
+
 }

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/OidGeneratorAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/OidGeneratorAbstract.java?rev=1304796&r1=1304795&r2=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/OidGeneratorAbstract.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/OidGeneratorAbstract.java Sat Mar 24 14:01:35 2012
@@ -19,25 +19,16 @@
 
 package org.apache.isis.runtimes.dflt.runtime.persistence.oidgenerator;
 
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.stringable.OidStringifier;
-import org.apache.isis.core.metamodel.adapter.oid.stringable.hex.OidStringifierHex;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.OidGenerator;
 
 public abstract class OidGeneratorAbstract implements OidGenerator {
 
     private final OidStringifier oidStringifier;
 
-    /**
-     * Defaults to using the {@link OidStringifierHex} for
-     * {@link #getOidStringifier()}. Subclasses can replace by calling
-     * {@link #OidGeneratorAbstract(OidStringifier)} instead.
-     */
-    public OidGeneratorAbstract() {
-        this(new OidStringifierHex());
-    }
-
-    public OidGeneratorAbstract(final OidStringifier oidStringifier) {
-        this.oidStringifier = oidStringifier;
+    public OidGeneratorAbstract(Class<? extends Oid> oidClass) {
+        this.oidStringifier = new OidStringifier(oidClass);
     }
 
     // //////////////////////////////////////////////////////////////
@@ -58,12 +49,12 @@ public abstract class OidGeneratorAbstra
     public void close() {
     }
 
-    /**
-     * Default implemenation returns {@link OidStringifierHex}.
-     * 
-     * <p>
-     * Subclasses can replace through constructor if required.
-     */
+    
+    // //////////////////////////////////////////////////////////////
+    // OidStringifier
+    // //////////////////////////////////////////////////////////////
+
+
     @Override
     public final OidStringifier getOidStringifier() {
         return oidStringifier;

Copied: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/serial/RootOidDefault.java (from r1301354, incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/simple/SerialOid.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/serial/RootOidDefault.java?p2=incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/serial/RootOidDefault.java&p1=incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/simple/SerialOid.java&r1=1301354&r2=1304796&rev=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/simple/SerialOid.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/serial/RootOidDefault.java Sat Mar 24 14:01:35 2012
@@ -17,139 +17,147 @@
  *  under the License.
  */
 
-package org.apache.isis.runtimes.dflt.runtime.persistence.oidgenerator.simple;
+package org.apache.isis.runtimes.dflt.runtime.persistence.oidgenerator.serial;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
 
 import java.io.IOException;
 import java.io.Serializable;
+import java.util.Iterator;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.apache.commons.lang.StringUtils;
+import com.google.common.base.Splitter;
 
 import org.apache.isis.core.commons.encoding.DataInputExtended;
 import org.apache.isis.core.commons.encoding.DataOutputExtended;
 import org.apache.isis.core.commons.encoding.Encodable;
-import org.apache.isis.core.commons.ensure.Assert;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.stringable.directly.DirectlyStringableOid;
+import org.apache.isis.core.commons.ensure.Ensure;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PojoAdapterBuilder;
 
-public final class SerialOid implements Encodable, Serializable, DirectlyStringableOid {
+public final class RootOidDefault implements Encodable, Serializable, RootOid {
 
     private static final long serialVersionUID = 1L;
 
-    static enum State {
-        PERSISTENT, TRANSIENT;
-        public boolean isTransient() {
-            return this == TRANSIENT;
-        }
-    }
-
-    public static SerialOid createPersistent(final long serialNo) {
-        return new SerialOid(serialNo, State.PERSISTENT);
-    }
-
-    public static SerialOid createTransient(final long serialNo) {
-        return new SerialOid(serialNo, State.TRANSIENT);
-    }
+    private final String objectType;
+    private String identifier;
 
     private int hashCode;
     private State state;
-    private SerialOid previous;
-    private long newSerialNo;
-    private long serialNo;
     private String toString;
     private String enString;
-
+    
     private static final String TOSTRING_SERIAL_NUM_PREFIX = "#";
-    private static final String TOSTRING_PREVIOUS_CONCAT = "+";
 
+    private static final String OBJECT_TYPE_PREFIX = ":";
     private static final String ENSTRING_SERIAL_NUM_PREFIX = ":";
-    private static final String ENSTRING_SERIAL_NUM_CONCAT = "~";
     
-
+    // identifier cannot contain @ or #
+    // @ is used by AggregateOid as an appendix
+    // # is used in REST URLs, so want to avoid possible clashes
     private static Pattern DESTRING_PATTERN = 
             Pattern.compile("^" +
-            		"(T?)OID" + ENSTRING_SERIAL_NUM_PREFIX + "(-?[0-9A-F]+)" +
-            		"(" 
-            		    + ENSTRING_SERIAL_NUM_CONCAT + "(T?)OID" + ENSTRING_SERIAL_NUM_PREFIX + "(-?[0-9A-F]+)" +
-            		")?" +
+            		"(T?)OID" +
+                    OBJECT_TYPE_PREFIX + "([^" + ENSTRING_SERIAL_NUM_PREFIX + "]+)" +
+                    ENSTRING_SERIAL_NUM_PREFIX + "(-?[^#@]+)" +  
             		"$");
 
+    
     // ////////////////////////////////////////////
-    // Constructor
-    // encode, decode
+    // Constructor, factory methods
     // ////////////////////////////////////////////
 
-    private SerialOid(final long serialNo, final State state) {
-        this.serialNo = serialNo;
+    public static RootOidDefault create(String objectType, final String identifier) {
+        return new RootOidDefault(objectType, identifier, State.PERSISTENT);
+    }
+
+    public static RootOidDefault createTransient(String objectType, final String identifier) {
+        return new RootOidDefault(objectType, identifier, State.TRANSIENT);
+    }
+
+    /**
+     * Primarily for tests
+     */
+    public static RootOidDefault create(String oidStr) {
+        final Iterator<String> iterator = Splitter.on("|").split(oidStr).iterator();
+        if(!iterator.hasNext()) { throw new IllegalArgumentException("expected oid in form XXX|123; oidStr: " + oidStr); }
+        String objectType = iterator.next();
+        if(!iterator.hasNext()) { throw new IllegalArgumentException("expected oid in form XXX|123; oidStr: " + oidStr); }
+        String identifier = iterator.next();
+        return create(objectType, identifier);
+    }
+
+    /**
+     * Primarily for tests
+     */
+    public static RootOidDefault createTransient(String oidStr) {
+        final Iterator<String> iterator = Splitter.on("|").split(oidStr).iterator();
+        if(!iterator.hasNext()) { throw new IllegalArgumentException("expected oid in form XXX|123; oidStr: " + oidStr); }
+        String objectType = iterator.next();
+        if(!iterator.hasNext()) { throw new IllegalArgumentException("expected oid in form XXX|123; oidStr: " + oidStr); }
+        String identifier = iterator.next();
+        return createTransient(objectType, identifier);
+    }
+
+    public RootOidDefault(String objectType, final String identifier, final State state) {
+        this.objectType = objectType;
+        this.identifier = identifier;
         this.state = state;
         initialized();
     }
 
-    public SerialOid(final DataInputExtended input) throws IOException {
-        this.serialNo = input.readLong();
-        this.state = input.readBoolean() ? State.TRANSIENT : State.PERSISTENT;
-        final boolean hasPrevious = input.readBoolean();
+    private void initialized() {
+        cacheState();
+    }
 
-        if (hasPrevious) {
-            final long previousSerialNo = input.readLong();
-            final State previousState = input.readBoolean() ? State.TRANSIENT : State.PERSISTENT;
-            this.previous = new SerialOid(previousSerialNo, previousState);
-        }
+    // ////////////////////////////////////////////
+    // Encodeable, deString'able, enString
+    // ////////////////////////////////////////////
+
+    public RootOidDefault(final DataInputExtended input) throws IOException {
+        this.objectType = input.readUTF();
+        this.identifier = input.readUTF();
+        this.state = input.readBoolean() ? State.TRANSIENT : State.PERSISTENT;
         initialized();
     }
 
     @Override
     public void encode(final DataOutputExtended output) throws IOException {
-        output.writeLong(this.serialNo);
+        output.writeUTF(this.objectType);
+        output.writeUTF(this.identifier);
         output.writeBoolean(this.state.isTransient());
-        final boolean hasPrevious = previous != null;
-        output.writeBoolean(hasPrevious);
-
-        if (hasPrevious) {
-            output.writeLong(previous.serialNo);
-            output.writeBoolean(previous.state.isTransient());
-        }
     }
 
-    private void initialized() {
-        cacheState();
-    }
 
     // ////////////////////////////////////////////
-    // Directly Stringable
+    // deString'able, enString
     // ////////////////////////////////////////////
 
     /**
      * @see DirectlyStringableOid
      * @see #enString()
      */
-    public static SerialOid deString(final String oidStr) {
+    public static RootOidDefault deString(final String oidStr) {
         final Matcher matcher = DESTRING_PATTERN.matcher(oidStr);
         if (!matcher.matches()) {
             throw new IllegalArgumentException("Could not parse OID '" + oidStr + "'; should match pattern: " + DESTRING_PATTERN.toString());
         }
 
         final String transientStr = matcher.group(1);
-        final String serialNumInHexStr = matcher.group(2);
-        final String previousStr = matcher.group(3);
-        
-        final SerialOid oid = createOid(transientStr, serialNumInHexStr);
+        final String objectType = matcher.group(2);
+        final String serialNumInHexStr = matcher.group(3);
         
-        if (!StringUtils.isEmpty(previousStr)) {
-            final String previousTransientStr = matcher.group(4);
-            final String previousSerialNumInHexStr = matcher.group(5);
-
-            oid.previous = createOid(previousTransientStr, previousSerialNumInHexStr);
-        }
+        final RootOidDefault oid = createOid(objectType, transientStr, serialNumInHexStr);
 
         return oid;
     }
 
-    private static SerialOid createOid(final String transientStr, final String serialNumInHexStr) {
+    private static RootOidDefault createOid(String objectType, final String transientStr, final String identifier) {
         final boolean isTransient = "T".equals(transientStr);
-        final long serialNum = Long.parseLong(serialNumInHexStr, 16);
-        return isTransient ? SerialOid.createTransient(serialNum) : SerialOid.createPersistent(serialNum);
+        return isTransient ? RootOidDefault.createTransient(objectType, identifier) : RootOidDefault.create(objectType, identifier);
     }
 
     /**
@@ -174,90 +182,54 @@ public final class SerialOid implements 
     }
 
     // ////////////////////////////////////////////
-    // isTransient
+    // Properties
     // ////////////////////////////////////////////
 
     @Override
-    public boolean isTransient() {
-        return state.isTransient();
+    public String getObjectType() {
+        return objectType;
     }
 
-    // ////////////////////////////////////////////
-    // copyFrom
-    // ////////////////////////////////////////////
 
     @Override
-    public void copyFrom(final Oid oid) {
-        Assert.assertTrue(oid instanceof SerialOid);
-        final SerialOid from = (SerialOid) oid;
-        this.serialNo = from.serialNo;
-        this.state = from.state;
-        cacheState();
+    public boolean isTransient() {
+        return state.isTransient();
     }
 
-    // ////////////////////////////////////////////
-    // Previous
-    // ////////////////////////////////////////////
-
-    @Override
-    public Oid getPrevious() {
-        return previous;
+    public String getIdentifier() {
+        return identifier;
     }
 
-    @Override
-    public boolean hasPrevious() {
-        return previous != null;
-    }
-
-    @Override
-    public void clearPrevious() {
-        previous = null;
-    }
 
     // ////////////////////////////////////////////
-    // SerialNo (not API)
+    // makePersistent
     // ////////////////////////////////////////////
 
-    /**
-     * Should be called prior to {@link #makePersistent()}
-     */
-    public void setId(final long serialNo) {
-        Assert.assertTrue(state.isTransient());
-        this.newSerialNo = serialNo;
-    }
-
+    
     @Override
-    public void makePersistent() {
-        Assert.assertTrue(state.isTransient());
-        Assert.assertTrue(newSerialNo != 0);
-        previous = new SerialOid(this.serialNo, state);
-        this.serialNo = newSerialNo;
-        this.state = State.PERSISTENT;
-        cacheState();
-    }
+    public RootOidDefault asPersistent(String identifier) {
+        Ensure.ensureThatState(state.isTransient(), is(true));
+        Ensure.ensureThatArg(identifier, is(not(nullValue())));
 
-    public long getSerialNo() {
-        return serialNo;
+        return new RootOidDefault(objectType, identifier, State.PERSISTENT);
     }
 
-    
+
     // ////////////////////////////////////////////
     // equals, hashCode
     // ////////////////////////////////////////////
 
     private void cacheState() {
         hashCode = 17;
-        hashCode = 37 * hashCode + (int) (serialNo ^ (serialNo >>> 32));
+        hashCode = 37 * hashCode + objectType.hashCode();
+        hashCode = 37 * hashCode + identifier.hashCode();
         hashCode = 37 * hashCode + (isTransient() ? 0 : 1);
-        toString = asString(this, TOSTRING_SERIAL_NUM_PREFIX) + (previous == null ? "" : TOSTRING_PREVIOUS_CONCAT);
-        
-        enString = asString(this, ENSTRING_SERIAL_NUM_PREFIX) + (previous == null ? "" : ENSTRING_SERIAL_NUM_CONCAT + asString(previous, ENSTRING_SERIAL_NUM_PREFIX));
-        
-        //enString = asString(this, ENSTRING_SERIAL_NUM_PREFIX); //?? what was this
+        toString = asString(this, TOSTRING_SERIAL_NUM_PREFIX);
+        enString = asString(this, ENSTRING_SERIAL_NUM_PREFIX);
     }
 
-    private String asString(final SerialOid x, final String serialNumPrefix) {
-        return (x.isTransient() ? "T" : "") + "OID" + serialNumPrefix + Long.toString(x.serialNo, 16).toUpperCase();
+    private static String asString(final RootOidDefault x, final String serialNumPrefix) {
+        return (x.isTransient() ? "T" : "") + "OID" + OBJECT_TYPE_PREFIX + x.objectType + serialNumPrefix + x.identifier;
     }
 
     /*
@@ -276,16 +248,11 @@ public final class SerialOid implements 
         if (getClass() != other.getClass()) {
             return false;
         }
-        return equals((SerialOid) other);
+        return equals((RootOidDefault) other);
     }
 
-    /**
-     * Overloaded to allow compiler to link directly if we know the compile-time
-     * type. (possible performance improvement - called 166,000 times in normal
-     * ref data fixture.
-     */
-    public boolean equals(final SerialOid other) {
-        return other.serialNo == serialNo && other.state == state;
+    public boolean equals(final RootOidDefault other) {
+        return other.identifier == identifier && other.state == state;
     }
 
     @Override
@@ -299,4 +266,5 @@ public final class SerialOid implements 
     }
 
 
+
 }

Copied: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/serial/RootOidGenerator.java (from r1301354, incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/simple/SimpleOidGenerator.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/serial/RootOidGenerator.java?p2=incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/serial/RootOidGenerator.java&p1=incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/simple/SimpleOidGenerator.java&r1=1301354&r2=1304796&rev=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/simple/SimpleOidGenerator.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/serial/RootOidGenerator.java Sat Mar 24 14:01:35 2012
@@ -17,7 +17,7 @@
  *  under the License.
  */
 
-package org.apache.isis.runtimes.dflt.runtime.persistence.oidgenerator.simple;
+package org.apache.isis.runtimes.dflt.runtime.persistence.oidgenerator.serial;
 
 import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
 import static org.apache.isis.core.commons.matchers.IsisMatchers.greaterThan;
@@ -25,8 +25,11 @@ import static org.hamcrest.CoreMatchers.
 
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.stringable.directly.OidStringifierDirect;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.runtimes.dflt.runtime.persistence.oidgenerator.OidGeneratorAbstract;
+import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.OidGenerator;
 
 /**
@@ -34,10 +37,10 @@ import org.apache.isis.runtimes.dflt.run
  * 
  * <p>
  * Specifies the {@link OidStringifierDirect} as the
- * {@link #getOidStringifier() OID stringifier} ({@link SerialOid} is
+ * {@link #getOidStringifier() OID stringifier} ({@link RootOidDefault} is
  * conformant)).
  */
-public class SimpleOidGenerator extends OidGeneratorAbstract {
+public class RootOidGenerator extends OidGeneratorAbstract {
 
     public static class Memento {
         private final long persistentSerialNumber;
@@ -65,7 +68,7 @@ public class SimpleOidGenerator extends 
     // constructor
     // //////////////////////////////////////////////////////////////
 
-    public SimpleOidGenerator() {
+    public RootOidGenerator() {
         this(1);
     }
 
@@ -73,16 +76,16 @@ public class SimpleOidGenerator extends 
      * Persistent {@link Oid}s count up from the provided seed parameter, while
      * {@link Oid#isTransient()} transient {@link Oid}s count down.
      */
-    public SimpleOidGenerator(final long seed) {
+    public RootOidGenerator(final long seed) {
         this(seed, Long.MIN_VALUE + seed);
     }
 
-    public SimpleOidGenerator(final Memento memento) {
+    public RootOidGenerator(final Memento memento) {
         this(memento.getPersistentSerialNumber(), memento.getTransientSerialNumber());
     }
 
-    private SimpleOidGenerator(final long persistentSerialNumber, final long transientSerialNumber) {
-        super(new OidStringifierDirect(SerialOid.class));
+    private RootOidGenerator(final long persistentSerialNumber, final long transientSerialNumber) {
+        super(RootOidDefault.class);
         ensureThatArg(persistentSerialNumber, is(greaterThan(0L)));
         this.persistentSerialNumber = persistentSerialNumber;
         this.transientSerialNumber = transientSerialNumber;
@@ -101,23 +104,21 @@ public class SimpleOidGenerator extends 
     // //////////////////////////////////////////////////////////////
 
     @Override
-    public synchronized SerialOid createTransientOid(final Object object) {
-        return SerialOid.createTransient(transientSerialNumber--); // counts
-                                                                   // down
+    public synchronized RootOid createTransientOid(final Object object) {
+        final ObjectSpecification objectSpec = getSpecificationLoader().loadSpecification(object.getClass());
+        final String objectType = objectSpec.getObjectType();
+
+        return RootOidDefault.createTransient(objectType, "" + (transientSerialNumber--)); // counts down
     }
 
     @Override
-    public synchronized void convertTransientToPersistentOid(final Oid oid) {
-        if (!(oid instanceof SerialOid)) {
-            throw new IllegalArgumentException("Oid is not a SerialOid");
-        }
-        final SerialOid serialOid = (SerialOid) oid;
-        serialOid.setId(persistentSerialNumber++); // counts up
-        serialOid.makePersistent();
+    public synchronized RootOid asPersistent(final RootOid rootOid) {
+        final long next = persistentSerialNumber++; // counts up
+        return rootOid.asPersistent("" + next);
     }
 
     @Override
-    public String createAggregateId(final Object pojo) {
+    public String createAggregateLocalId(final Object pojo) {
         return Long.toHexString(aggregatedId++);
     }
 
@@ -145,6 +146,10 @@ public class SimpleOidGenerator extends 
     // debug
     // //////////////////////////////////////////////////////////////
 
+    protected SpecificationLoader getSpecificationLoader() {
+        return IsisContext.getSpecificationLoader();
+    }
+
     @Override
     public void debugData(final DebugBuilder debug) {
         debug.appendln("Persistent", persistentSerialNumber);

Copied: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/serial/RootOidGeneratorSeededOnCurrentTime.java (from r1301354, incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/timebased/TimeBasedOidGenerator.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/serial/RootOidGeneratorSeededOnCurrentTime.java?p2=incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/serial/RootOidGeneratorSeededOnCurrentTime.java&p1=incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/timebased/TimeBasedOidGenerator.java&r1=1301354&r2=1304796&rev=1304796&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/timebased/TimeBasedOidGenerator.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/oidgenerator/serial/RootOidGeneratorSeededOnCurrentTime.java Sat Mar 24 14:01:35 2012
@@ -17,28 +17,27 @@
  *  under the License.
  */
 
-package org.apache.isis.runtimes.dflt.runtime.persistence.oidgenerator.timebased;
+package org.apache.isis.runtimes.dflt.runtime.persistence.oidgenerator.serial;
 
 import java.util.Date;
 
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.runtimes.dflt.runtime.persistence.oidgenerator.simple.SimpleOidGenerator;
 
 /**
  * Generates {@link Oid}s based on the system clock.
  * 
  * <p>
  * The same algorithm and {@link Oid} implementation as
- * {@link SimpleOidGenerator} is used; it just seeds with a different value.
+ * {@link RootOidGenerator} is used; it just seeds with a different value.
  */
-public class TimeBasedOidGenerator extends SimpleOidGenerator {
+public class RootOidGeneratorSeededOnCurrentTime extends RootOidGenerator {
 
     @Override
     public String name() {
         return "Time Initialised OID Generator";
     }
 
-    public TimeBasedOidGenerator() {
+    public RootOidGeneratorSeededOnCurrentTime() {
         super(new Date().getTime());
     }
 }