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/08/09 15:18:21 UTC

svn commit: r1371197 [3/4] - in /incubator/isis/trunk: examples/quickstart/dom/src/main/java/dom/todo/ framework/core/commons/src/main/java/org/apache/isis/core/commons/base64/ framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapt...

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=1371197&r1=1371196&r2=1371197&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 Thu Aug  9 13:18:18 2012
@@ -24,6 +24,8 @@ import org.apache.isis.core.metamodel.ad
 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.adapter.oid.TypedOid;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.algorithm.PersistAlgorithm;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.OidGenerator;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
@@ -65,9 +67,39 @@ public interface AdapterManagerPersist {
      * 
      * <p>
      * If the {@link ObjectAdapter adapter} is recreated, its
-     * {@link ResolveState} will be {@link ResolveState#GHOST} if a persistent
-     * {@link Oid}, or {@link ResolveState#TRANSIENT} otherwise.
+     * {@link ResolveState} will be set to either
+     * {@link ResolveState#TRANSIENT} or {@link ResolveState#GHOST} based on
+     * whether the {@link Oid} is {@link Oid#isTransient() transient} or not.
+     * 
+     * @param oid
+     * @param recreatedPojo - already known to the object store impl, or a service
+     */
+    ObjectAdapter mapRecreatedPojo(Oid oid, Object recreatedPojo);
+
+    
+    /**
+     * Either returns an existing {@link ObjectAdapter adapter} (as per 
+     * {@link #getAdapterFor(Oid)}), otherwise re-creates an adapter with the 
+     * specified (persistent) {@link Oid}.
+     * 
+     * <p>
+     * Typically called when the {@link Oid} is already known, that is, when
+     * resolving an already-persisted object. Is also available for
+     * <tt>Memento</tt> support however, so {@link Oid} could also represent a
+     * {@link Oid#isTransient() transient} object.
+     * 
+     * <p>
+     * The pojo itself is recreated by delegating to a {@link PojoRecreator} implementation.
+     * The default impl just uses the {@link ObjectSpecification#createObject()};
+     * however object stores (eg JDO/DataNucleus) can provide alternative implementations
+     * in order to ensure that the created pojo is attached to a persistence context.
+     * 
+     * <p>
+     * If the {@link ObjectAdapter adapter} is recreated, its
+     * {@link ResolveState} will be set to {@link ResolveState#GHOST}.
+     * 
+     * @param oid
      */
-    ObjectAdapter recreateAdapter(Oid oid, Object pojo);
+    ObjectAdapter recreatePersistentAdapter(TypedOid oid);
 
 }

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=1371197&r1=1371196&r2=1371197&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 Thu Aug  9 13:18:18 2012
@@ -39,10 +39,10 @@ public interface AdapterManagerTestSuppo
      * Note that the {@link RootOid} must represent a {@link Oid#isTransient()
      * transient} object. If an {@link ObjectAdapter adapter} is required for a
      * persistent {@link RootOid}, just use
-     * {@link #recreateAdapter(RootOid, Object)}.
+     * {@link #mapRecreatedPojo(RootOid, Object)}.
      * 
      * @see #adapterFor(Object)
-     * @see #recreateAdapter(RootOid, Object)
+     * @see #mapRecreatedPojo(RootOid, Object)
      */
     ObjectAdapter testCreateTransient(Object pojo, RootOid oid);
 

Added: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/PojoRecreator.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/PojoRecreator.java?rev=1371197&view=auto
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/PojoRecreator.java (added)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/PojoRecreator.java Thu Aug  9 13:18:18 2012
@@ -0,0 +1,9 @@
+package org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager;
+
+import org.apache.isis.core.metamodel.adapter.oid.TypedOid;
+
+public interface PojoRecreator {
+
+    Object recreatePojo(final TypedOid oid);
+    
+}

Added: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/PojoRecreatorDefault.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/PojoRecreatorDefault.java?rev=1371197&view=auto
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/PojoRecreatorDefault.java (added)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/PojoRecreatorDefault.java Thu Aug  9 13:18:18 2012
@@ -0,0 +1,27 @@
+package org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager;
+
+import org.apache.isis.core.metamodel.adapter.oid.TypedOid;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
+
+public class PojoRecreatorDefault implements PojoRecreator, SpecificationLoaderAware {
+
+    private SpecificationLoader specificationLoader;
+
+    public Object recreatePojo(final TypedOid oid) {
+        final ObjectSpecification spec = getSpecificationLoader().lookupBySpecId(oid.getObjectSpecId());
+        return spec.createObject();
+    }
+
+    
+    protected SpecificationLoader getSpecificationLoader() {
+        return specificationLoader;
+    }
+
+    @Override
+    public void setSpecificationLoader(SpecificationLoader specificationLoader) {
+        this.specificationLoader = specificationLoader;
+    }
+
+}

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/persistence/PersistenceSession.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/persistence/PersistenceSession.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/persistence/PersistenceSession.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/persistence/PersistenceSession.java Thu Aug  9 13:18:18 2012
@@ -74,7 +74,6 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.runtimes.dflt.runtime.persistence.FixturesInstalledFlag;
 import org.apache.isis.runtimes.dflt.runtime.persistence.NotPersistableException;
 import org.apache.isis.runtimes.dflt.runtime.persistence.PersistenceSessionAware;
-import org.apache.isis.runtimes.dflt.runtime.persistence.PersistenceSessionHydratorAware;
 import org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager.AdapterManagerExtended;
 import org.apache.isis.runtimes.dflt.runtime.persistence.internal.RuntimeContextFromSession;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.ObjectStore;
@@ -97,11 +96,9 @@ import org.apache.isis.runtimes.dflt.run
 import org.apache.isis.runtimes.dflt.runtime.transaction.TransactionalClosureAbstract;
 import org.apache.isis.runtimes.dflt.runtime.transaction.TransactionalClosureWithReturnAbstract;
 
-public class PersistenceSession implements PersistenceSessionContainer, PersistenceSessionAdaptedServiceManager, PersistenceSessionTransactionManagement, PersistenceSessionHydrator, PersistenceSessionTestSupport, SpecificationLoaderAware,
+public class PersistenceSession implements PersistenceSessionContainer, PersistenceSessionAdaptedServiceManager, PersistenceSessionTransactionManagement, PersistenceSessionTestSupport, SpecificationLoaderAware,
         IsisTransactionManagerAware, SessionScopedComponent, Injectable, DebuggableWithTitle, ToPersistObjectSet {
 
-
-    
     private final PersistenceSessionFactory persistenceSessionFactory;
     private final ObjectAdapterFactory adapterFactory;
     private final ObjectFactory objectFactory;
@@ -303,7 +300,7 @@ public class PersistenceSession implemen
             if (existingOid == null) {
                 serviceAdapter = getAdapterManager().adapterFor(service);
             } else {
-                serviceAdapter = getAdapterManager().recreateAdapter(existingOid, service);
+                serviceAdapter = getAdapterManager().mapRecreatedPojo(existingOid, service);
             }
 
             if (serviceAdapter.getOid().isTransient()) {
@@ -398,49 +395,6 @@ public class PersistenceSession implemen
         return adapter;
     }
 
-    @Override
-    public final ObjectAdapter recreateAdapter(final TypedOid oid) {
-        final ObjectSpecId objectSpecId = oid.getObjectSpecId();
-        final ObjectSpecification objectSpec = getSpecificationLoader().lookupBySpecId(objectSpecId);
-        return recreateAdapter(objectSpec, oid);
-    }
-
-    @Override
-    public ObjectAdapter recreateAdapter(final ObjectSpecification specification, final Oid oid) {
-        final ObjectAdapter adapterLookedUpByOid = getAdapterManager().getAdapterFor(oid);
-        if (adapterLookedUpByOid != null) {
-            return adapterLookedUpByOid;
-        }
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("recreating adapter for Oid: " + oid + " of type " + specification);
-        }
-        
-        final Object pojo = specification.createObject();
-
-        return getAdapterManager().recreateAdapter(oid, pojo);
-    }
-
-    @Override
-    public ObjectAdapter recreateAdapter(final Oid oid, final Object pojo) {
-        final ObjectAdapter adapterLookedUpByOid = getAdapterManager().getAdapterFor(oid);
-        if (adapterLookedUpByOid != null) {
-            return adapterLookedUpByOid;
-        }
-
-        final ObjectAdapter adapterLookedUpByPojo = getAdapterManager().getAdapterFor(pojo);
-        if (adapterLookedUpByPojo != null) {
-            return adapterLookedUpByPojo;
-        }
-
-        if (LOG.isDebugEnabled()) {
-            // don't touch pojo in case cause it to resolve.
-            LOG.debug("recreating adapter for Oid: " + oid + " for provided pojo ");
-        }
-        return getAdapterManager().recreateAdapter(oid, pojo);
-    }
-    
-
 
     // ///////////////////////////////////////////////////////////////////////////
     // findInstances, getInstances
@@ -522,6 +476,20 @@ public class PersistenceSession implemen
         return getInstancesFromPersistenceLayer(persistenceQuery);
     }
 
+    private List<ObjectAdapter> getInstancesFromPersistenceLayer(final PersistenceQuery persistenceQuery) {
+        return getTransactionManager().executeWithinTransaction(new TransactionalClosureWithReturnAbstract<List<ObjectAdapter>>() {
+            @Override
+            public List<ObjectAdapter> execute() {
+                return objectStore.getInstances(persistenceQuery);
+            }
+
+            @Override
+            public void onSuccess() {
+                clearAllDirty();
+            }
+        });
+    }
+
     // ///////////////////////////////////////////////////////////////////////////
     // Manual dirtying support
     // ///////////////////////////////////////////////////////////////////////////
@@ -587,9 +555,9 @@ public class PersistenceSession implemen
                 object.getSpecification().clearDirty(object);
             }
         }
-
     }
 
+    
     // ///////////////////////////////////////////////////////////////////////////
     // Services
     // ///////////////////////////////////////////////////////////////////////////
@@ -637,7 +605,7 @@ public class PersistenceSession implemen
     private ObjectAdapter getService(final Object servicePojo) {
         final ObjectSpecification serviceSpecification = getSpecificationLoader().loadSpecification(servicePojo.getClass());
         final RootOid oid = getOidForService(serviceSpecification);
-        final ObjectAdapter serviceAdapter = getAdapterManager().recreateAdapter(oid, servicePojo);
+        final ObjectAdapter serviceAdapter = getAdapterManager().mapRecreatedPojo(oid, servicePojo);
         
         serviceAdapter.markAsResolvedIfPossible();
         return serviceAdapter;
@@ -651,178 +619,8 @@ public class PersistenceSession implemen
     }
 
 
-    // ////////////////////////////////////////////////////////////////////
-    // Helpers
-    // ////////////////////////////////////////////////////////////////////
-
-    protected boolean isImmutable(final ObjectAdapter adapter) {
-        final ObjectSpecification noSpec = adapter.getSpecification();
-        return ImmutableFacetUtils.isAlwaysImmutable(noSpec) || (ImmutableFacetUtils.isImmutableOncePersisted(noSpec) && adapter.representsPersistent());
-    }
-
-    // ////////////////////////////////////////////////////////////////////
-    // injectInto
-    // ////////////////////////////////////////////////////////////////////
-
-    @Override
-    public void injectInto(final Object candidate) {
-        if (PersistenceSessionAware.class.isAssignableFrom(candidate.getClass())) {
-            final PersistenceSessionAware cast = PersistenceSessionAware.class.cast(candidate);
-            cast.setPersistenceSession(this);
-        }
-        if (PersistenceSessionHydratorAware.class.isAssignableFrom(candidate.getClass())) {
-            final PersistenceSessionHydratorAware cast = PersistenceSessionHydratorAware.class.cast(candidate);
-            cast.setHydrator(this);
-        }
-    }
-
     // ///////////////////////////////////////////////////////////////////////////
-    // Debugging
-    // ///////////////////////////////////////////////////////////////////////////
-
-    @Override
-    public void debugData(final DebugBuilder debug) {
-        debug.appendTitle(getClass().getName());
-        debug.appendln("container", servicesInjector);
-        debug.appendln();
-
-        adapterManager.debugData(debug);
-        debug.appendln();
-
-        debug.appendln("manually dirtiable support (isDirty flag)?", dirtiableSupport);
-
-        debug.appendTitle("OID Generator");
-        oidGenerator.debugData(debug);
-        debug.appendln();
-
-        debug.appendTitle("Services");
-        for (final Object servicePojo : servicesInjector.getRegisteredServices()) {
-            final String id = ServiceUtil.id(servicePojo);
-            final Class<? extends Object> serviceClass = servicePojo.getClass();
-            final ObjectSpecification serviceSpecification = getSpecificationLoader().loadSpecification(serviceClass);
-            final String serviceClassName = serviceClass.getName();
-            final Oid oidForService = getOidForService(serviceSpecification);
-            final String serviceId = id + (id.equals(serviceClassName) ? "" : " (" + serviceClassName + ")");
-            debug.appendln(oidForService != null ? oidForService.toString() : "[NULL]", serviceId);
-        }
-        debug.appendln();
-
-        
-        debug.appendTitle("Persistor");
-        getTransactionManager().debugData(debug);
-        debug.appendln("Persist Algorithm", persistAlgorithm);
-        debug.appendln("Object Store", objectStore);
-        debug.appendln();
-
-        objectStore.debugData(debug);
-    }
-
-    // ///////////////////////////////////////////////////////////////////////////
-    // Dependencies (injected in constructor, possibly implicitly)
-    // ///////////////////////////////////////////////////////////////////////////
-
-    /**
-     * The configured {@link ObjectAdapterFactory}.
-     * 
-     * <p>
-     * Injected in constructor.
-     */
-    public final ObjectAdapterFactory getAdapterFactory() {
-        return adapterFactory;
-    }
-
-    /**
-     * The configured {@link OidGenerator}.
-     * 
-     * <p>
-     * Injected in constructor.
-     */
-    public final OidGenerator getOidGenerator() {
-        return oidGenerator;
-    }
-
-    /**
-     * The configured {@link AdapterManager}.
-     * 
-     * <p>
-     * Injected in constructor.
-     */
-    public final AdapterManagerExtended getAdapterManager() {
-        return adapterManager;
-    }
-
-    /**
-     * The configured {@link ServicesInjector}.
-     */
-    public ServicesInjector getServicesInjector() {
-        return servicesInjector;
-    }
-
-    /**
-     * The configured {@link ObjectFactory}.
-     * 
-     * <p>
-     * Obtained indirectly from the injected reflector.
-     */
-    public ObjectFactory getObjectFactory() {
-        return objectFactory;
-    }
-
-    // ///////////////////////////////////////////////////////////////////////////
-    // Dependencies (injected)
-    // ///////////////////////////////////////////////////////////////////////////
-
-    protected SpecificationLoader getSpecificationLoader() {
-        return specificationLoader;
-    }
-
-    /**
-     * Inject the {@link SpecificationLoader}.
-     * 
-     * <p>
-     * The need to inject the reflector was introduced to support the
-     * HibernateObjectStore, which installs its own
-     * <tt>HibernateClassStrategy</tt> to cope with the proxy classes that
-     * Hibernate wraps around lists, sets and maps.
-     */
-    public void setSpecificationLoader(final SpecificationLoader specificationLoader) {
-        this.specificationLoader = specificationLoader;
-    }
-
-    /**
-     * Inject the {@link IsisTransactionManager}.
-     * 
-     * <p>
-     * This must be injected using setter-based injection rather than through
-     * the constructor because there is a bidirectional relationship between the
-     * {@link PersistenceSessionHydrator} and the {@link IsisTransactionManager}.
-     * 
-     * @see #getTransactionManager()
-     */
-    public void setTransactionManager(final IsisTransactionManager transactionManager) {
-        this.transactionManager = transactionManager;
-    }
-
-    
-    /**
-     * The configured {@link IsisTransactionManager}.
-     * 
-     * @see #setTransactionManager(IsisTransactionManager)
-     */
-    public IsisTransactionManager getTransactionManager() {
-        return transactionManager;
-    }
-
-    
-    
-    
-
-    
-    
-    
-
-    // ///////////////////////////////////////////////////////////////////////////
-    // init, shutdown
+    // fixture installation
     // ///////////////////////////////////////////////////////////////////////////
 
 
@@ -862,14 +660,13 @@ public class PersistenceSession implemen
         }
     }
 
-
-
     @Override
     protected void finalize() throws Throwable {
         super.finalize();
-        LOG.debug("finalizing object manager");
+        LOG.debug("finalizing persistence session");
     }
-
+    
+    
     // ///////////////////////////////////////////////////////////////////////////
     // loadObject, reload
     // ///////////////////////////////////////////////////////////////////////////
@@ -1114,6 +911,7 @@ public class PersistenceSession implemen
         getUpdateNotifier().addChangedObject(adapter);
     }
 
+    
     // ///////////////////////////////////////////////////////////////////////////
     // destroyObject
     // ///////////////////////////////////////////////////////////////////////////
@@ -1165,6 +963,8 @@ public class PersistenceSession implemen
     // remapAsPersistent
     // ///////////////////////////////////////////////////////////////////////////
 
+    private Map<Oid, Oid> persistentByTransient = Maps.newHashMap();
+
     /**
      * Callback from the {@link PersistAlgorithm} (or equivalent; some object
      * stores such as Hibernate will use listeners instead) to indicate that the
@@ -1181,11 +981,6 @@ public class PersistenceSession implemen
      * The {@link PersistAlgorithm} is called from
      * {@link #makePersistent(ObjectAdapter)}.
      * 
-     * <p>
-     * TODO: the <tt>PersistenceSessionProxy</tt> doesn't have this method;
-     * should document better why this is the case, and where the equivalent
-     * functionality is (somewhere in the marshalling stuff, I think).
-     * 
      * @see #remapAsPersistent(ObjectAdapter)
      */
     @Override
@@ -1197,31 +992,12 @@ public class PersistenceSession implemen
     }
 
 
-    private Map<Oid, Oid> persistentByTransient = Maps.newHashMap();
     
     @Override
     public Oid remappedFrom(Oid transientOid) {
         return persistentByTransient.get(transientOid);
     }
 
-    // ///////////////////////////////////////////////////////////////////////////
-    // getInstances
-    // ///////////////////////////////////////////////////////////////////////////
-
-
-    private List<ObjectAdapter> getInstancesFromPersistenceLayer(final PersistenceQuery persistenceQuery) {
-        return getTransactionManager().executeWithinTransaction(new TransactionalClosureWithReturnAbstract<List<ObjectAdapter>>() {
-            @Override
-            public List<ObjectAdapter> execute() {
-                return objectStore.getInstances(persistenceQuery);
-            }
-
-            @Override
-            public void onSuccess() {
-                clearAllDirty();
-            }
-        });
-    }
 
     // ///////////////////////////////////////////////////////////////////////////
     // hasInstances
@@ -1282,6 +1058,7 @@ public class PersistenceSession implemen
         getTransactionManager().addCommand(objectStore.createCreateObjectCommand(object));
     }
 
+    
     // ///////////////////////////////////////////////////////////////////////////
     // Debugging
     // ///////////////////////////////////////////////////////////////////////////
@@ -1293,6 +1070,43 @@ public class PersistenceSession implemen
     }
 
     @Override
+    public void debugData(final DebugBuilder debug) {
+        debug.appendTitle(getClass().getName());
+        debug.appendln("container", servicesInjector);
+        debug.appendln();
+
+        adapterManager.debugData(debug);
+        debug.appendln();
+
+        debug.appendln("manually dirtiable support (isDirty flag)?", dirtiableSupport);
+
+        debug.appendTitle("OID Generator");
+        oidGenerator.debugData(debug);
+        debug.appendln();
+
+        debug.appendTitle("Services");
+        for (final Object servicePojo : servicesInjector.getRegisteredServices()) {
+            final String id = ServiceUtil.id(servicePojo);
+            final Class<? extends Object> serviceClass = servicePojo.getClass();
+            final ObjectSpecification serviceSpecification = getSpecificationLoader().loadSpecification(serviceClass);
+            final String serviceClassName = serviceClass.getName();
+            final Oid oidForService = getOidForService(serviceSpecification);
+            final String serviceId = id + (id.equals(serviceClassName) ? "" : " (" + serviceClassName + ")");
+            debug.appendln(oidForService != null ? oidForService.toString() : "[NULL]", serviceId);
+        }
+        debug.appendln();
+
+        
+        debug.appendTitle("Persistor");
+        getTransactionManager().debugData(debug);
+        debug.appendln("Persist Algorithm", persistAlgorithm);
+        debug.appendln("Object Store", objectStore);
+        debug.appendln();
+
+        objectStore.debugData(debug);
+    }
+    
+    @Override
     public String toString() {
         final ToString toString = new ToString(this);
         if (objectStore != null) {
@@ -1304,8 +1118,31 @@ public class PersistenceSession implemen
         return toString.toString();
     }
 
+    
+    // ////////////////////////////////////////////////////////////////////
+    // Helpers
+    // ////////////////////////////////////////////////////////////////////
+
+    protected boolean isImmutable(final ObjectAdapter adapter) {
+        final ObjectSpecification noSpec = adapter.getSpecification();
+        return ImmutableFacetUtils.isAlwaysImmutable(noSpec) || (ImmutableFacetUtils.isImmutableOncePersisted(noSpec) && adapter.representsPersistent());
+    }
+
+    // ////////////////////////////////////////////////////////////////////
+    // injectInto
+    // ////////////////////////////////////////////////////////////////////
+
+    @Override
+    public void injectInto(final Object candidate) {
+        if (PersistenceSessionAware.class.isAssignableFrom(candidate.getClass())) {
+            final PersistenceSessionAware cast = PersistenceSessionAware.class.cast(candidate);
+            cast.setPersistenceSession(this);
+        }
+    }
+
+    
     // ///////////////////////////////////////////////////////////////////////////
-    // Dependencies
+    // Dependencies (injected in constructor, possibly implicitly)
     // ///////////////////////////////////////////////////////////////////////////
 
     /**
@@ -1326,6 +1163,100 @@ public class PersistenceSession implemen
         return getTransactionManager().getTransaction().getUpdateNotifier();
     }
 
+    /**
+     * The configured {@link ObjectAdapterFactory}.
+     * 
+     * <p>
+     * Injected in constructor.
+     */
+    public final ObjectAdapterFactory getAdapterFactory() {
+        return adapterFactory;
+    }
+
+    /**
+     * The configured {@link OidGenerator}.
+     * 
+     * <p>
+     * Injected in constructor.
+     */
+    public final OidGenerator getOidGenerator() {
+        return oidGenerator;
+    }
+
+    /**
+     * The configured {@link AdapterManager}.
+     * 
+     * <p>
+     * Injected in constructor.
+     */
+    public final AdapterManagerExtended getAdapterManager() {
+        return adapterManager;
+    }
+
+    /**
+     * The configured {@link ServicesInjector}.
+     */
+    public ServicesInjector getServicesInjector() {
+        return servicesInjector;
+    }
+
+    /**
+     * The configured {@link ObjectFactory}.
+     * 
+     * <p>
+     * Obtained indirectly from the injected reflector.
+     */
+    public ObjectFactory getObjectFactory() {
+        return objectFactory;
+    }
+
+    
+    // ///////////////////////////////////////////////////////////////////////////
+    // Dependencies (injected)
+    // ///////////////////////////////////////////////////////////////////////////
+
+    protected SpecificationLoader getSpecificationLoader() {
+        return specificationLoader;
+    }
+
+    /**
+     * Inject the {@link SpecificationLoader}.
+     * 
+     * <p>
+     * The need to inject the reflector was introduced to support the
+     * HibernateObjectStore, which installs its own
+     * <tt>HibernateClassStrategy</tt> to cope with the proxy classes that
+     * Hibernate wraps around lists, sets and maps.
+     */
+    public void setSpecificationLoader(final SpecificationLoader specificationLoader) {
+        this.specificationLoader = specificationLoader;
+    }
+
+    /**
+     * Inject the {@link IsisTransactionManager}.
+     * 
+     * <p>
+     * This must be injected using setter-based injection rather than through
+     * the constructor because there is a bidirectional relationship between the
+     * {@link PersistenceSessionHydrator} and the {@link IsisTransactionManager}.
+     * 
+     * @see #getTransactionManager()
+     */
+    public void setTransactionManager(final IsisTransactionManager transactionManager) {
+        this.transactionManager = transactionManager;
+    }
+
+    
+    /**
+     * The configured {@link IsisTransactionManager}.
+     * 
+     * @see #setTransactionManager(IsisTransactionManager)
+     */
+    public IsisTransactionManager getTransactionManager() {
+        return transactionManager;
+    }
+
+
     // ///////////////////////////////////////////////////////////////////////////
     // Dependencies (from context)
     // ///////////////////////////////////////////////////////////////////////////
@@ -1333,7 +1264,5 @@ public class PersistenceSession implemen
     private static AuthenticationSession getAuthenticationSession() {
         return IsisContext.getAuthenticationSession();
     }
-
-
     
 }

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransaction.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransaction.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransaction.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransaction.java Thu Aug  9 13:18:18 2012
@@ -21,9 +21,9 @@ package org.apache.isis.runtimes.dflt.ru
 
 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 static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
 
 import java.util.Collections;
 import java.util.List;
@@ -33,6 +33,7 @@ import com.google.common.collect.Lists;
 import org.apache.log4j.Logger;
 
 import org.apache.isis.core.commons.components.TransactionScopedComponent;
+import org.apache.isis.core.commons.ensure.Ensure;
 import org.apache.isis.core.commons.lang.ToString;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ResolveState;
@@ -41,6 +42,7 @@ import org.apache.isis.runtimes.dflt.run
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.DestroyObjectCommand;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PersistenceCommand;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.SaveObjectCommand;
+import org.apache.isis.runtimes.dflt.runtime.transaction.ObjectPersistenceException;
 
 /**
  * Used by the {@link IsisTransactionManager} to captures a set of changes to be
@@ -157,11 +159,13 @@ public class IsisTransaction implements 
 
     private static final Logger LOG = Logger.getLogger(IsisTransaction.class);
 
+
     private final ObjectStoreTransactionManagement objectStore;
     private final List<PersistenceCommand> commands = Lists.newArrayList();
     private final IsisTransactionManager transactionManager;
     private final MessageBroker messageBroker;
     private final UpdateNotifier updateNotifier;
+    private final List<ObjectPersistenceException> exceptions = Lists.newArrayList();
 
     private State state;
 
@@ -197,7 +201,6 @@ public class IsisTransaction implements 
         this.state = state;
     }
 
-
     
     // //////////////////////////////////////////////////////////
     // Commands
@@ -264,6 +267,24 @@ public class IsisTransaction implements 
 
 
 
+    /////////////////////////////////////////////////////////////////////////
+    // for worm-hole handling of exceptions
+    /////////////////////////////////////////////////////////////////////////
+
+    public void ensureExceptionsListIsEmpty() {
+        Ensure.ensureThatArg(exceptions.isEmpty(), is(true), "exceptions list is not empty");
+    }
+
+    public void addException(ObjectPersistenceException exception) {
+        exceptions.add(exception);
+    }
+    
+    public List<ObjectPersistenceException> getExceptionsIfAny() {
+        return Collections.unmodifiableList(exceptions);
+    }
+
+    
+
     // ////////////////////////////////////////////////////////////////
     // flush
     // ////////////////////////////////////////////////////////////////
@@ -330,6 +351,7 @@ public class IsisTransaction implements 
 
     public final void commit() {
         ensureThatState(getState().canCommit(), is(true), "state is: " + getState());
+        ensureThatState(exceptions.isEmpty(), is(true), "cannot commit: " + exceptions.size() + " exceptions have been raised");
 
         if (LOG.isDebugEnabled()) {
             LOG.debug("commit transaction " + this);

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransactionManager.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransactionManager.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransactionManager.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransactionManager.java Thu Aug  9 13:18:18 2012
@@ -26,6 +26,8 @@ import static org.hamcrest.CoreMatchers.
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.CoreMatchers.nullValue;
 
+import java.util.List;
+
 import org.apache.log4j.Logger;
 
 import org.apache.isis.core.commons.components.Injectable;
@@ -37,6 +39,7 @@ import org.apache.isis.runtimes.dflt.run
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSessionTransactionManagement;
 import org.apache.isis.runtimes.dflt.runtime.system.session.IsisSession;
 import org.apache.isis.runtimes.dflt.runtime.transaction.IsisTransactionManagerException;
+import org.apache.isis.runtimes.dflt.runtime.transaction.ObjectPersistenceException;
 import org.apache.isis.runtimes.dflt.runtime.transaction.messagebroker.MessageBrokerDefault;
 import org.apache.isis.runtimes.dflt.runtime.transaction.updatenotifier.UpdateNotifierDefault;
 
@@ -57,8 +60,6 @@ public class IsisTransactionManager impl
      */
     private IsisTransaction transaction;
 
-    
-
 
 
     // ////////////////////////////////////////////////////////////////
@@ -242,7 +243,7 @@ public class IsisTransactionManager impl
     // start, flush, abort, end
     // //////////////////////////////////////////////////////
 
-    public void startTransaction() {
+    public synchronized void startTransaction() {
 
         boolean noneInProgress = false;
         if (getTransaction() == null || getTransaction().getState().isComplete()) {
@@ -260,7 +261,7 @@ public class IsisTransactionManager impl
         }
     }
 
-    public boolean flushTransaction() {
+    public synchronized boolean flushTransaction() {
 
         if (LOG.isDebugEnabled()) {
             LOG.debug("flushTransaction");
@@ -276,17 +277,60 @@ public class IsisTransactionManager impl
     /**
      * Ends the transaction if nesting level is 0.
      */
-    public void endTransaction() {
+    public synchronized void endTransaction() {
         if (LOG.isDebugEnabled()) {
             LOG.debug("endTransaction: level " + (transactionLevel) + "->" + (transactionLevel - 1));
         }
 
         transactionLevel--;
         if (transactionLevel == 0) {
-            LOG.debug("endTransaction: committing");
-            objectPersistor.objectChangedAllDirty();
-            getTransaction().commit();
-            objectStore.endTransaction();
+
+            //
+            // TODO: granted, this is some fairly byzantine coding.  but I'm trying to account for different types
+            // of object store implementations that could start throwing exceptions at any stage.
+            // once the contract/API for the objectstore is better tied down, hopefully can simplify this...
+            //
+            
+            List<ObjectPersistenceException> exceptions = this.getTransaction().getExceptionsIfAny();
+            if(exceptions.isEmpty()) {
+            
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("endTransaction: committing");
+                }
+                
+                objectPersistor.objectChangedAllDirty();
+                
+                // just in case any additional exceptions were raised...
+                exceptions = this.getTransaction().getExceptionsIfAny();
+            }
+            
+            if(exceptions.isEmpty()) {
+                getTransaction().commit();
+                
+                // in case any additional exceptions were raised...
+                exceptions = this.getTransaction().getExceptionsIfAny();
+            }
+            
+            if(exceptions.isEmpty()) {
+                objectStore.endTransaction();
+                
+                // just in case any additional exceptions were raised...
+                exceptions = this.getTransaction().getExceptionsIfAny();
+            }
+            
+            if(!exceptions.isEmpty()) {
+                
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("endTransaction: aborting instead, " + exceptions.size() + " exception(s) have been raised");
+                }
+                abortTransaction();
+                
+                // just in case any additional exceptions were raised...
+                exceptions = this.getTransaction().getExceptionsIfAny();
+                
+                throw exceptionToThrowFrom(exceptions);
+            }
+            
         } else if (transactionLevel < 0) {
             LOG.error("endTransaction: transactionLevel=" + transactionLevel);
             transactionLevel = 0;
@@ -294,7 +338,20 @@ public class IsisTransactionManager impl
         }
     }
 
-    public void abortTransaction() {
+
+    private ObjectPersistenceException exceptionToThrowFrom(List<ObjectPersistenceException> exceptions) {
+        if(exceptions.size() == 1) {
+            return exceptions.get(0);
+        } 
+        final StringBuilder buf = new StringBuilder();
+        for (ObjectPersistenceException ope : exceptions) {
+            buf.append(ope.getMessage()).append("\n");
+        }
+        return new ObjectPersistenceException(buf.toString());
+    }
+    
+
+    public synchronized void abortTransaction() {
         if (getTransaction() != null) {
             getTransaction().abort();
             transactionLevel = 0;

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/AdapterManagerDefault_aggregateAdapters.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/AdapterManagerDefault_aggregateAdapters.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/AdapterManagerDefault_aggregateAdapters.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/AdapterManagerDefault_aggregateAdapters.java Thu Aug  9 13:18:18 2012
@@ -143,7 +143,7 @@ public class AdapterManagerDefault_aggre
         rootObject = new Customer();
         aggregatedObject = new Name();
         
-        persistentParentAdapter = adapterManager.recreateAdapter(
+        persistentParentAdapter = adapterManager.mapRecreatedPojo(
                 RootOidDefault.create(ObjectSpecId.of("CUS"), "1"), rootObject);
     }
 

Modified: incubator/isis/trunk/framework/runtimes/dflt/testsupport/src/main/java/org/apache/isis/runtimes/dflt/testsupport/IsisSystemWithFixtures.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/testsupport/src/main/java/org/apache/isis/runtimes/dflt/testsupport/IsisSystemWithFixtures.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/testsupport/src/main/java/org/apache/isis/runtimes/dflt/testsupport/IsisSystemWithFixtures.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/testsupport/src/main/java/org/apache/isis/runtimes/dflt/testsupport/IsisSystemWithFixtures.java Thu Aug  9 13:18:18 2012
@@ -44,6 +44,7 @@ import org.apache.isis.core.runtime.auth
 import org.apache.isis.core.runtime.authentication.AuthenticationRequest;
 import org.apache.isis.runtimes.dflt.objectstores.dflt.InMemoryPersistenceMechanismInstaller;
 import org.apache.isis.runtimes.dflt.runtime.installerregistry.installerapi.PersistenceMechanismInstaller;
+import org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager.AdapterManagerExtended;
 import org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager.AdapterManagerPersist;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.ObjectStore;
 import org.apache.isis.runtimes.dflt.runtime.system.DeploymentType;
@@ -338,7 +339,7 @@ public class IsisSystemWithFixtures impl
     }
     
     private DomainObjectContainer getContainer() {
-        return IsisContext.getPersistenceSession().getServicesInjector().getContainer();
+        return getPersistenceSession().getServicesInjector().getContainer();
     }
 
     /**
@@ -500,18 +501,18 @@ public class IsisSystemWithFixtures impl
 
     public ObjectAdapter adapterFor(Object domainObject) {
         ensureSessionInProgress();
-        return IsisContext.getPersistenceSession().getAdapterManager().adapterFor(domainObject);
+        return getAdapterManager().adapterFor(domainObject);
     }
 
     public ObjectAdapter reload(RootOid oid) {
         ensureSessionInProgress();
-        final PersistenceSession persistenceSession = IsisContext.getPersistenceSession();
+        final PersistenceSession persistenceSession = getPersistenceSession();
         return persistenceSession.loadObject(oid);
     }
 
     public ObjectAdapter recreateAdapter(RootOid oid) {
         ensureSessionInProgress();
-        return IsisContext.getPersistenceSession().recreateAdapter(oid);
+        return getAdapterManager().recreatePersistentAdapter(oid);
     }
 
     public ObjectAdapter remapAsPersistent(Object pojo, RootOid persistentOid) {
@@ -524,7 +525,7 @@ public class IsisSystemWithFixtures impl
 
     @SuppressWarnings("unchecked")
     public <T extends ObjectStore> T getObjectStore(Class<T> cls) {
-        final PersistenceSession persistenceSession = IsisContext.getPersistenceSession();
+        final PersistenceSession persistenceSession = getPersistenceSession();
         return (T) persistenceSession.getObjectStore();
     }
 
@@ -574,11 +575,11 @@ public class IsisSystemWithFixtures impl
 
     
     private AdapterManagerPersist getAdapterManagerPersist() {
-        return (AdapterManagerPersist)IsisContext.getPersistenceSession().getAdapterManager();
+        return (AdapterManagerPersist)getAdapterManager();
     }
 
     public void beginTran() {
-        final IsisTransactionManager transactionManager = IsisContext.getPersistenceSession().getTransactionManager();
+        final IsisTransactionManager transactionManager = getTransactionManager();
         final IsisTransaction transaction = transactionManager.getTransaction();
 
         if(transaction == null) {
@@ -605,7 +606,7 @@ public class IsisSystemWithFixtures impl
     }
 
     public void commitTran() {
-        final IsisTransactionManager transactionManager = IsisContext.getPersistenceSession().getTransactionManager();
+        final IsisTransactionManager transactionManager = getTransactionManager();
         final IsisTransaction transaction = transactionManager.getTransaction();
         if(transaction == null) {
             Assert.fail("No transaction exists");
@@ -627,7 +628,7 @@ public class IsisSystemWithFixtures impl
     }
 
     public void abortTran() {
-        final IsisTransactionManager transactionManager = IsisContext.getPersistenceSession().getTransactionManager();
+        final IsisTransactionManager transactionManager = getTransactionManager();
         final IsisTransaction transaction = transactionManager.getTransaction();
         if(transaction == null) {
             Assert.fail("No transaction exists");
@@ -649,5 +650,18 @@ public class IsisSystemWithFixtures impl
         }
     }
 
+    protected IsisTransactionManager getTransactionManager() {
+        return getPersistenceSession().getTransactionManager();
+    }
+    
+    protected AdapterManagerExtended getAdapterManager() {
+        return getPersistenceSession().getAdapterManager();
+    }
+
+    protected PersistenceSession getPersistenceSession() {
+        return IsisContext.getPersistenceSession();
+    }
+
+
     
 }

Modified: incubator/isis/trunk/framework/viewer/html/src/main/java/org/apache/isis/viewer/html/context/PersistentRootAdapterMapping.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/html/src/main/java/org/apache/isis/viewer/html/context/PersistentRootAdapterMapping.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/html/src/main/java/org/apache/isis/viewer/html/context/PersistentRootAdapterMapping.java (original)
+++ incubator/isis/trunk/framework/viewer/html/src/main/java/org/apache/isis/viewer/html/context/PersistentRootAdapterMapping.java Thu Aug  9 13:18:18 2012
@@ -24,6 +24,7 @@ import org.apache.isis.core.commons.ensu
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.RootOidDefault;
 import org.apache.isis.core.metamodel.adapter.version.Version;
+import org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager.AdapterManagerExtended;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.AdapterManager;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
@@ -69,7 +70,7 @@ public class PersistentRootAdapterMappin
     @Override
     public void restoreToLoader() {
         final RootOidDefault oid = RootOidDefault.deString(getOidStr());
-        final ObjectAdapter adapter = getPersistenceSession().recreateAdapter(oid);
+        final ObjectAdapter adapter = getAdapterManager().recreatePersistentAdapter(oid);
         adapter.setVersion(getVersion());
     }
 
@@ -108,12 +109,12 @@ public class PersistentRootAdapterMappin
     // Dependencies (from context)
     // /////////////////////////////////////////////////////
 
-    private static AdapterManager getAdapterManager() {
-        return getPersistenceSession().getAdapterManager();
-    }
-
-    private static PersistenceSession getPersistenceSession() {
+    protected PersistenceSession getPersistenceSession() {
         return IsisContext.getPersistenceSession();
     }
 
+    protected AdapterManagerExtended getAdapterManager() {
+        return getPersistenceSession().getAdapterManager();
+    }
+    
 }

Modified: incubator/isis/trunk/framework/viewer/html/src/main/resources/htmlviewer.js
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/html/src/main/resources/htmlviewer.js?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/html/src/main/resources/htmlviewer.js (original)
+++ incubator/isis/trunk/framework/viewer/html/src/main/resources/htmlviewer.js Thu Aug  9 13:18:18 2012
@@ -18,5 +18,5 @@
  */
 $(document).ready(function()
 {
-    $(".message-header").fadeOut(2000)
+    $(".message-header").fadeOut(5000)
 });
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/restfulobjects/restfulobjects-viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/util/OidUtils.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/restfulobjects/restfulobjects-viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/util/OidUtils.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/restfulobjects/restfulobjects-viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/util/OidUtils.java (original)
+++ incubator/isis/trunk/framework/viewer/restfulobjects/restfulobjects-viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/util/OidUtils.java Thu Aug  9 13:18:18 2012
@@ -35,7 +35,7 @@ public final class OidUtils {
         if(adapterFor != null) {
             return adapterFor;
         }
-        return resourceContext.getPersistenceSession().recreateAdapter(rootOid);
+        return resourceContext.getPersistenceSession().getAdapterManager().recreatePersistentAdapter(rootOid);
     }
 
     public static String getOidStr(final ResourceContext resourceContext, final ObjectAdapter objectAdapter) {

Modified: incubator/isis/trunk/framework/viewer/scimpi/scimpi-dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultOidObjectMapping.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/scimpi/scimpi-dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultOidObjectMapping.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/scimpi/scimpi-dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultOidObjectMapping.java (original)
+++ incubator/isis/trunk/framework/viewer/scimpi/scimpi-dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultOidObjectMapping.java Thu Aug  9 13:18:18 2012
@@ -47,6 +47,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager.AdapterManagerExtended;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.AdapterManager;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
@@ -325,7 +326,7 @@ public class DefaultOidObjectMapping imp
         final TypedOid typedOid = new OidMarshaller().unmarshal(oidStr, TypedOid.class);
 
         if(!typedOid.isTransient()) {
-            return getPersistenceSession().recreateAdapter(typedOid);
+            return getAdapterManager().recreatePersistentAdapter(typedOid);
         } else {
             return mappedObject(oidStr);
         }
@@ -374,7 +375,6 @@ public class DefaultOidObjectMapping imp
 //        final String aggregatedId = split.length > 2?split[2]:null;
 //            
 //        final ObjectSpecification spec = getSpecificationLoader().lookupByObjectType(objectType);
-        final ObjectSpecification spec = getSpecificationLoader().lookupBySpecId(typedOid.getObjectSpecId());
 
         //if ((type == 'T')) {
         if (typedOid.isTransient()) {
@@ -384,13 +384,12 @@ public class DefaultOidObjectMapping imp
                 mapping = requestTransients.get(oidStr);
             }
             if (mapping == null) {
-                final Object pojo = spec.createObject();
 
                 // create as a (transient) root adapter
                 // Oid oid = deString(objectType, oidData, State.TRANSIENT);
                 //return getPersistenceSession().recreateAdapter(oid, pojo);
                 
-                return getPersistenceSession().recreateAdapter(typedOid, pojo);
+                return getAdapterManager().recreatePersistentAdapter(typedOid);
             }
             
             final ObjectAdapter mappedTransientObject = mapping.getObject();
@@ -522,10 +521,6 @@ public class DefaultOidObjectMapping imp
     // from context
     ///////////////////////////////////////
     
-//    protected OidStringifier getOidStringifier() {
-//        return getPersistenceSession().getOidGenerator().getOidStringifier();
-//    }
-    
     protected SpecificationLoader getSpecificationLoader() {
         return IsisContext.getSpecificationLoader();
     }
@@ -534,7 +529,7 @@ public class DefaultOidObjectMapping imp
         return IsisContext.getPersistenceSession();
     }
 
-    protected AdapterManager getAdapterManager() {
+    protected AdapterManagerExtended getAdapterManager() {
         return getPersistenceSession().getAdapterManager();
     }
 

Modified: incubator/isis/trunk/framework/viewer/scimpi/scimpi-dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/Mapping.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/scimpi/scimpi-dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/Mapping.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/scimpi/scimpi-dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/Mapping.java (original)
+++ incubator/isis/trunk/framework/viewer/scimpi/scimpi-dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/Mapping.java Thu Aug  9 13:18:18 2012
@@ -26,7 +26,9 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.runtimes.dflt.runtime.memento.Memento;
+import org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager.AdapterManagerExtended;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
+import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
 
 interface Mapping {
     ObjectAdapter getObject();
@@ -112,7 +114,7 @@ class PersistentRootAdapterMapping imple
 
     @Override
     public String debug() {
-        return oid + "  " + spec.getShortIdentifier() + "  " + IsisContext.getPersistenceSession().getAdapterManager().getAdapterFor(oid);
+        return oid + "  " + spec.getShortIdentifier() + "  " + getAdapterManager().getAdapterFor(oid);
     }
 
     @Override
@@ -120,13 +122,14 @@ class PersistentRootAdapterMapping imple
         if (!IsisContext.inTransaction()) {
             throw new IllegalStateException(getClass().getSimpleName() + " requires transaction in order to load");
         }
-        return IsisContext.getPersistenceSession().loadObject(oid);
+        return getPersistenceSession().loadObject(oid);
     }
 
     @Override
     public void reload() {
-        if (IsisContext.getPersistenceSession().getAdapterManager().getAdapterFor(oid) == null) {
-            IsisContext.getPersistenceSession().recreateAdapter(spec, oid);
+        if (getAdapterManager().getAdapterFor(oid) == null) {
+            final Object recreatedPojo = spec.createObject();
+            getAdapterManager().mapRecreatedPojo(oid, recreatedPojo);
         }
     }
 
@@ -156,4 +159,18 @@ class PersistentRootAdapterMapping imple
     public void update() {
     }
 
+    
+    ////////////////////////////////////
+    
+
+    protected PersistenceSession getPersistenceSession() {
+        return IsisContext.getPersistenceSession();
+    }
+
+
+    protected AdapterManagerExtended getAdapterManager() {
+        return getPersistenceSession().getAdapterManager();
+    }
+
+
 }

Modified: incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java (original)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java Thu Aug  9 13:18:18 2012
@@ -22,6 +22,7 @@ package org.apache.isis.viewer.wicket.mo
 import java.io.Serializable;
 
 import org.apache.isis.core.metamodel.spec.ActionType;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 /**
@@ -31,24 +32,24 @@ public class ActionMemento implements Se
 
     private static final long serialVersionUID = 1L;
 
-    private final SpecMemento owningType;
+    private final ObjectSpecId owningType;
     private final ActionType actionType;
     private final String nameParmsId;
 
     private transient ObjectAction action;
 
-    public ActionMemento(final SpecMemento owningType, final ActionType actionType, final String nameParmsId) {
+    public ActionMemento(final ObjectSpecId owningType, final ActionType actionType, final String nameParmsId) {
         this.owningType = owningType;
         this.actionType = actionType;
         this.nameParmsId = nameParmsId;
     }
 
     public ActionMemento(final ObjectAction action) {
-        this(new SpecMemento(action.getOnType()), action.getType(), action.getIdentifier().toNameParmsIdentityString());
+        this(action.getOnType().getSpecId(), action.getType(), action.getIdentifier().toNameParmsIdentityString());
         this.action = action;
     }
 
-    public SpecMemento getOwningType() {
+    public ObjectSpecId getOwningType() {
         return owningType;
     }
 
@@ -62,7 +63,7 @@ public class ActionMemento implements Se
 
     public ObjectAction getAction() {
         if (action == null) {
-            action = owningType.getSpecification().getObjectAction(actionType, nameParmsId);
+            action = SpecUtils.getSpecificationFor(owningType).getObjectAction(actionType, nameParmsId);
         }
         return action;
     }

Modified: incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/CollectionMemento.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/CollectionMemento.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/CollectionMemento.java (original)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/CollectionMemento.java Thu Aug  9 13:18:18 2012
@@ -21,6 +21,7 @@ package org.apache.isis.viewer.wicket.mo
 
 import java.io.Serializable;
 
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
@@ -37,22 +38,22 @@ public class CollectionMemento implement
         return IsisContext.getSpecificationLoader().loadSpecification(association.getIdentifier().toClassIdentityString());
     }
 
-    private final SpecMemento owningType;
+    private final ObjectSpecId owningType;
     private final String id;
 
     private transient OneToManyAssociation collection;
 
-    public CollectionMemento(final SpecMemento owningType, final String id) {
+    public CollectionMemento(final ObjectSpecId owningType, final String id) {
         this.owningType = owningType;
         this.id = id;
     }
 
     public CollectionMemento(final OneToManyAssociation collection) {
-        this(new SpecMemento(owningSpecFor(collection)), collection.getIdentifier().toNameIdentityString());
+        this(owningSpecFor(collection).getSpecId(), collection.getIdentifier().toNameIdentityString());
         this.collection = collection;
     }
 
-    public SpecMemento getOwningType() {
+    public ObjectSpecId getOwningType() {
         return owningType;
     }
 
@@ -73,7 +74,7 @@ public class CollectionMemento implement
 
     public OneToManyAssociation getCollection() {
         if (collection == null) {
-            collection = (OneToManyAssociation) owningType.getSpecification().getAssociation(id);
+            collection = (OneToManyAssociation) SpecUtils.getSpecificationFor(owningType).getAssociation(id);
         }
         return collection;
     }

Modified: incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java (original)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java Thu Aug  9 13:18:18 2012
@@ -23,11 +23,15 @@ import java.io.Serializable;
 
 import org.apache.isis.core.commons.ensure.Ensure;
 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.core.metamodel.adapter.oid.OidMarshaller;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.adapter.oid.TypedOid;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.runtimes.dflt.runtime.memento.Memento;
+import org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager.AdapterManagerExtended;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.wicket.model.util.Oids;
@@ -49,12 +53,10 @@ public class ObjectAdapterMemento implem
     /**
      * Factory method
      */
-    public static ObjectAdapterMemento createPersistent(final Oid oid, final SpecMemento specMemento) {
-        return new ObjectAdapterMemento(oid, specMemento);
+    public static ObjectAdapterMemento createPersistent(final RootOid rootOid) {
+        return new ObjectAdapterMemento(rootOid);
     }
 
-    private final SpecMemento specMemento;
-    private String titleHint;
 
     enum Type {
         /**
@@ -64,14 +66,26 @@ public class ObjectAdapterMemento implem
          */
         ENCODEABLE {
             @Override
-            ObjectAdapter recreateAdapter(final ObjectAdapterMemento nom) {
-                final EncodableFacet encodableFacet = nom.specMemento.getSpecification().getFacet(EncodableFacet.class);
-                return encodableFacet.fromEncodedString(nom.encodableValue);
+            ObjectAdapter recreateAdapter(final ObjectAdapterMemento oam) {
+                ObjectSpecId objectSpecId = oam.objectSpecId;
+                ObjectSpecification objectSpec = SpecUtils.getSpecificationFor(objectSpecId);
+                final EncodableFacet encodableFacet = objectSpec.getFacet(EncodableFacet.class);
+                return encodableFacet.fromEncodedString(oam.encodableValue);
             }
 
             @Override
-            public String toString(final ObjectAdapterMemento nom) {
-                return nom.encodableValue;
+            public boolean equals(ObjectAdapterMemento oam, ObjectAdapterMemento other) {
+                return other.type == ENCODEABLE && oam.encodableValue.equals(other.encodableValue);
+            }
+
+            @Override
+            public int hashCode(ObjectAdapterMemento oam) {
+                return oam.encodableValue.hashCode();
+            }
+
+            @Override
+            public String toString(final ObjectAdapterMemento oam) {
+                return oam.encodableValue;
             }
         },
         /**
@@ -80,17 +94,28 @@ public class ObjectAdapterMemento implem
          */
         PERSISTENT {
             @Override
-            ObjectAdapter recreateAdapter(final ObjectAdapterMemento nom) {
-                return getPersistenceSession().recreateAdapter(nom.getSpecMemento().getSpecification(), nom.persistentOid);
+            ObjectAdapter recreateAdapter(final ObjectAdapterMemento oam) {
+                TypedOid oid = oidMarshaller.unmarshal(oam.persistentOidStr, TypedOid.class);
+                return getAdapterManager().recreatePersistentAdapter(oid);
             }
 
-            private PersistenceSession getPersistenceSession() {
-                return IsisContext.getPersistenceSession();
+            private AdapterManagerExtended getAdapterManager() {
+                return IsisContext.getPersistenceSession().getAdapterManager();
+            }
+            
+            @Override
+            public boolean equals(ObjectAdapterMemento oam, ObjectAdapterMemento other) {
+                return other.type == PERSISTENT && oam.persistentOidStr.equals(other.persistentOidStr);
             }
 
             @Override
-            public String toString(final ObjectAdapterMemento nom) {
-                return nom.persistentOid.toString();
+            public int hashCode(ObjectAdapterMemento oam) {
+                return oam.persistentOidStr.hashCode();
+            }
+
+            @Override
+            public String toString(final ObjectAdapterMemento oam) {
+                return oam.persistentOidStr;
             }
         },
         /**
@@ -99,14 +124,24 @@ public class ObjectAdapterMemento implem
          */
         TRANSIENT {
             @Override
-            ObjectAdapter recreateAdapter(final ObjectAdapterMemento nom) {
-                final ObjectAdapter adapter = nom.transientMemento.recreateObject();
+            ObjectAdapter recreateAdapter(final ObjectAdapterMemento oam) {
+                final ObjectAdapter adapter = oam.transientMemento.recreateObject();
                 return adapter;
             }
 
             @Override
-            public String toString(final ObjectAdapterMemento nom) {
-                return nom.transientMemento.toString();
+            public boolean equals(ObjectAdapterMemento oam, ObjectAdapterMemento other) {
+                return other.type == TRANSIENT && oam.transientMemento.equals(other.transientMemento);
+            }
+
+            @Override
+            public int hashCode(ObjectAdapterMemento oam) {
+                return oam.transientMemento.hashCode();
+            }
+            
+            @Override
+            public String toString(final ObjectAdapterMemento oam) {
+                return oam.transientMemento.toString();
             }
         };
 
@@ -116,11 +151,17 @@ public class ObjectAdapterMemento implem
 
         abstract ObjectAdapter recreateAdapter(ObjectAdapterMemento nom);
 
+        public abstract boolean equals(ObjectAdapterMemento oam, ObjectAdapterMemento other);
+        public abstract int hashCode(ObjectAdapterMemento objectAdapterMemento);
+        
         public abstract String toString(ObjectAdapterMemento adapterMemento);
     }
 
     private Type type;
 
+    private final ObjectSpecId objectSpecId;
+    private String titleHint;
+
     /**
      * The current value, if {@link Type#ENCODEABLE}.
      * 
@@ -128,13 +169,14 @@ public class ObjectAdapterMemento implem
      * Will be <tt>null</tt> otherwise.
      */
     private String encodableValue;
+    
     /**
      * The current value, if {@link Type#PERSISTENT}.
      * 
      * <p>
      * Will be <tt>null</tt> otherwise.
      */
-    private Oid persistentOid;
+    private String persistentOidStr;
 
     /**
      * The current value, if {@link Type#TRANSIENT}.
@@ -144,10 +186,12 @@ public class ObjectAdapterMemento implem
      */
     private Memento transientMemento;
 
-    private ObjectAdapterMemento(final Oid oid, final SpecMemento specMemento) {
-        Ensure.ensureThatArg(oid, Oids.isPersistent());
-        this.persistentOid = oid;
-        this.specMemento = specMemento;
+    private final static OidMarshaller oidMarshaller = new OidMarshaller();
+    
+    private ObjectAdapterMemento(final RootOid rootOid) {
+        Ensure.ensureThatArg(rootOid, Oids.isPersistent());
+        this.persistentOidStr = oidMarshaller.marshal(rootOid);
+        this.objectSpecId = rootOid.getObjectSpecId();
         this.type = Type.PERSISTENT;
     }
 
@@ -156,36 +200,42 @@ public class ObjectAdapterMemento implem
             throw new IllegalArgumentException("adapter cannot be null");
         }
         final ObjectSpecification specification = adapter.getSpecification();
-        specMemento = new SpecMemento(specification);
+        objectSpecId = specification.getSpecId();
         init(adapter);
-        captureTitleHintIfPossible(adapter);
+        captureTitleHintIfPossible();
     }
 
     private void init(final ObjectAdapter adapter) {
-        final ObjectSpecification specification = specMemento.getSpecification();
+        
+        final ObjectSpecification specification = adapter.getSpecification();
+
         final EncodableFacet encodableFacet = specification.getFacet(EncodableFacet.class);
         final boolean isEncodable = encodableFacet != null;
         if (isEncodable) {
             encodableValue = encodableFacet.toEncodedString(adapter);
             type = Type.ENCODEABLE;
-        } else {
-            final Oid oid = adapter.getOid();
-            if (oid.isTransient()) {
-                transientMemento = new Memento(adapter);
-                type = Type.TRANSIENT;
-            } else {
-                persistentOid = oid;
-                type = Type.PERSISTENT;
-            }
+            return;
         }
+        
+        final RootOid oid = (RootOid) adapter.getOid();
+        if (oid.isTransient()) {
+            transientMemento = new Memento(adapter);
+            type = Type.TRANSIENT;
+            return;
+        } 
+        
+        persistentOidStr = oidMarshaller.marshal(oid);
+        type = Type.PERSISTENT;
     }
 
-    public void captureTitleHintIfPossible(final ObjectAdapter adapter) {
-        if (adapter == null) {
+    
+    public void captureTitleHintIfPossible() {
+        if (this.titleHint != null) {
             return;
-        }
-        if (adapter.isTitleAvailable()) {
-            this.titleHint = adapter.titleString();
+        } 
+        ObjectAdapter objectAdapter = this.getObjectAdapter();
+        if (objectAdapter.isTitleAvailable()) {
+            this.titleHint = objectAdapter.titleString();
         }
     }
 
@@ -219,8 +269,19 @@ public class ObjectAdapterMemento implem
         init(adapter);
     }
 
-    public SpecMemento getSpecMemento() {
-        return specMemento;
+    public ObjectSpecId getObjectSpecId() {
+        return objectSpecId;
+    }
+
+    
+    @Override
+    public int hashCode() {
+        return type.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        return (obj instanceof ObjectAdapterMemento) && type.equals(this, (ObjectAdapterMemento)obj);
     }
 
     @Override
@@ -228,4 +289,5 @@ public class ObjectAdapterMemento implem
         return type.toString(this);
     }
 
+
 }

Modified: incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/PageParameterNames.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/PageParameterNames.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/PageParameterNames.java (original)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/PageParameterNames.java Thu Aug  9 13:18:18 2012
@@ -29,17 +29,19 @@ import org.apache.isis.viewer.wicket.mod
  */
 public enum PageParameterNames {
 
+//    /**
+//     * Whether the object is persistent or not.
+//     */
+//    OBJECT_PERSISTENT,
+//    /**
+//     * The object's spec, as the fully qualified class name.
+//     */
+//    OBJECT_SPEC,
     /**
-     * Whether the object is persistent or not.
-     */
-    OBJECT_PERSISTENT,
-    /**
-     * The object's spec, as the fully qualified class name.
-     */
-    OBJECT_SPEC,
-    /**
-     * The object's {@link Oid} (only used if the object is
-     * {@link #OBJECT_PERSISTENT persistent}.
+     * The object's {@link Oid}.
+     * 
+     * <p>
+     * Also encodes the object's spec, and whether the object is persistent or not.
      */
     OBJECT_OID,
     /**

Modified: incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/PropertyMemento.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/PropertyMemento.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/PropertyMemento.java (original)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/PropertyMemento.java Thu Aug  9 13:18:18 2012
@@ -21,6 +21,7 @@ package org.apache.isis.viewer.wicket.mo
 
 import java.io.Serializable;
 
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
@@ -34,39 +35,39 @@ public class PropertyMemento implements 
         return IsisContext.getSpecificationLoader().loadSpecification(association.getIdentifier().toClassIdentityString());
     }
 
-    private final SpecMemento owningType;
+    private final ObjectSpecId owningType;
     private final String identifier;
 
     /**
      * Lazily loaded as required.
      */
-    private SpecMemento type;
+    private ObjectSpecId type;
 
     private transient OneToOneAssociation property;
 
-    public PropertyMemento(final SpecMemento owningType, final String name) {
+    public PropertyMemento(final ObjectSpecId owningType, final String name) {
         this(owningType, name, null);
     }
 
-    public PropertyMemento(final SpecMemento owningType, final String name, final SpecMemento type) {
+    public PropertyMemento(final ObjectSpecId owningType, final String name, final ObjectSpecId type) {
         this.owningType = owningType;
         this.identifier = name;
         this.type = type;
     }
 
     public PropertyMemento(final OneToOneAssociation property) {
-        this(new SpecMemento(owningSpecFor(property)), property.getIdentifier().toNameIdentityString(), new SpecMemento(property.getSpecification()));
+        this(owningSpecFor(property).getSpecId(), property.getIdentifier().toNameIdentityString(), property.getSpecification().getSpecId());
         this.property = property;
     }
 
-    public SpecMemento getOwningType() {
+    public ObjectSpecId getOwningType() {
         return owningType;
     }
 
-    public SpecMemento getType() {
+    public ObjectSpecId getType() {
         if (type == null) {
             // lazy load if need be
-            type = new SpecMemento(getProperty().getSpecification());
+            type = getProperty().getSpecification().getSpecId();
         }
         return type;
     }
@@ -77,7 +78,7 @@ public class PropertyMemento implements 
 
     public OneToOneAssociation getProperty() {
         if (property == null) {
-            property = (OneToOneAssociation) owningType.getSpecification().getAssociation(identifier);
+            property = (OneToOneAssociation) SpecUtils.getSpecificationFor(owningType).getAssociation(identifier);
         }
         return property;
     }

Added: incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/SpecUtils.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/SpecUtils.java?rev=1371197&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/SpecUtils.java (added)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/SpecUtils.java Thu Aug  9 13:18:18 2012
@@ -0,0 +1,28 @@
+package org.apache.isis.viewer.wicket.model.mementos;
+
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationContainer;
+import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.wicket.model.util.ClassLoaders;
+
+public final class SpecUtils {
+    
+    private SpecUtils(){}
+
+    public static ObjectSpecification getSpecificationFor(ObjectSpecId objectSpecId) {
+        ObjectSpecification objectSpec = getSpecificationLoader().lookupBySpecId(objectSpecId);
+        if(objectSpec != null) {
+            return objectSpec;
+        } 
+        
+        // attempt to load directly.
+        return getSpecificationLoader().loadSpecification(objectSpecId.asString());
+    }
+
+    protected static SpecificationLoader getSpecificationLoader() {
+        return IsisContext.getSpecificationLoader();
+    }
+
+}

Modified: incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java?rev=1371197&r1=1371196&r2=1371197&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java (original)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java Thu Aug  9 13:18:18 2012
@@ -33,10 +33,12 @@ import org.apache.wicket.markup.html.lin
 import org.apache.isis.applib.Identifier;
 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.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.adapter.oid.stringable.OidStringifier;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.spec.ActionType;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
@@ -46,7 +48,6 @@ import org.apache.isis.viewer.wicket.mod
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.mementos.PageParameterNames;
-import org.apache.isis.viewer.wicket.model.mementos.SpecMemento;
 import org.apache.isis.viewer.wicket.model.util.ActionParams;
 
 /**
@@ -88,6 +89,8 @@ public class ActionModel extends ModelAb
         SELECT
     }
 
+    private final static OidMarshaller oidMarshaller = new OidMarshaller();
+
     /**
      * Factory; for use directly.
      */
@@ -223,20 +226,28 @@ public class ActionModel extends ModelAb
         return ActionType.valueOf(PageParameterNames.ACTION_TYPE.getFrom(pageParameters));
     }
 
-    private static SpecMemento actionOwningSpecFor(final PageParameters pageParameters) {
-        return SpecMemento.representing(PageParameterNames.ACTION_OWNING_SPEC.getFrom(pageParameters));
+    private static ObjectSpecId actionOwningSpecFor(final PageParameters pageParameters) {
+        return ObjectSpecId.of(PageParameterNames.ACTION_OWNING_SPEC.getFrom(pageParameters));
     }
 
     private static ObjectAdapterMemento newObjectAdapterMementoFrom(final PageParameters pageParameters, final OidStringifier oidStringifier) {
-        return ObjectAdapterMemento.createPersistent(oidFor(pageParameters, oidStringifier), objectSpecFor(pageParameters));
+        RootOid oid = oidFor(pageParameters);
+        if(oid.isTransient()) {
+            //return ObjectAdapterMemento.
+            return null;
+        } else {
+            return ObjectAdapterMemento.createPersistent(oid);
+        }
     }
 
-    private static SpecMemento objectSpecFor(final PageParameters pageParameters) {
-        return SpecMemento.representing(PageParameterNames.OBJECT_SPEC.getFrom(pageParameters));
-    }
+//    private static SpecMemento objectSpecFor(final PageParameters pageParameters) {
+//        return SpecMemento.representing(PageParameterNames.OBJECT_SPEC.getFrom(pageParameters));
+//    }
 
-    private static Oid oidFor(final PageParameters pageParameters, final OidStringifier oidStringifier) {
-        return oidStringifier.deString(PageParameterNames.OBJECT_OID.getFrom(pageParameters));
+    
+    private static RootOid oidFor(final PageParameters pageParameters) {
+        String oidStr = PageParameterNames.OBJECT_OID.getFrom(pageParameters);
+        return oidMarshaller.unmarshal(oidStr, RootOid.class);
     }
 
     private ActionModel(final ObjectAdapterMemento adapterMemento, final ActionMemento actionMemento, final Mode actionMode, final SingleResultsMode singleResultsMode) {