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 2014/01/22 23:03:44 UTC

[1/2] git commit: ISIS-654: changes to QueryResultsCache API

Updated Branches:
  refs/heads/master b6a1bea37 -> 6b497b0ca


ISIS-654: changes to QueryResultsCache API

get(), additional overloads, make Key and Value nested static classes public

In addition, improved toString() for logging.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/ec91d22a
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/ec91d22a
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/ec91d22a

Branch: refs/heads/master
Commit: ec91d22a7f3a9e7102e971d99a2631cb07d0fe7b
Parents: b6a1bea
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 22 22:02:17 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 22 22:02:17 2014 +0000

----------------------------------------------------------------------
 .../queryresultscache/QueryResultsCache.java    | 95 ++++++++++++++++----
 .../QueryResultsCache_KeyTest.java              | 20 +++++
 2 files changed, 99 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/ec91d22a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
index 80954c7..f62f888 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
@@ -24,23 +24,37 @@ import javax.enterprise.context.RequestScoped;
 
 import com.google.common.collect.Maps;
 
-import org.apache.isis.applib.services.queryresultscache.QueryResultsCache.CacheKey;
-import org.apache.isis.applib.services.queryresultscache.QueryResultsCache.CacheValue;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.applib.annotation.Programmatic;
 
 @RequestScoped
 public class QueryResultsCache {
 
-    static class CacheKey {
+    private static final Logger LOG = LoggerFactory.getLogger(QueryResultsCache.class);
+
+    public static class Key {
         private final Class<?> callingClass;
         private final String methodName;
         private final Object[] keys;
         
-        public CacheKey(Class<?> callingClass, String methodName, Object... keys) {
+        public Key(Class<?> callingClass, String methodName, Object... keys) {
             this.callingClass = callingClass;
             this.methodName = methodName;
             this.keys = keys;
         }
         
+        public Class<?> getCallingClass() {
+            return callingClass;
+        }
+        public String getMethodName() {
+            return methodName;
+        }
+        public Object[] getKeys() {
+            return keys;
+        }
+        
         @Override
         public boolean equals(Object obj) {
             if (this == obj)
@@ -49,7 +63,7 @@ public class QueryResultsCache {
                 return false;
             if (getClass() != obj.getClass())
                 return false;
-            CacheKey other = (CacheKey) obj;
+            Key other = (Key) obj;
             if (callingClass == null) {
                 if (other.callingClass != null)
                     return false;
@@ -74,32 +88,81 @@ public class QueryResultsCache {
             result = prime * result + ((methodName == null) ? 0 : methodName.hashCode());
             return result;
         }
+
+        @Override
+        public String toString() {
+            return callingClass.getName() + "#" + methodName  + Arrays.toString(keys);
+        }
     }
     
-    public static class CacheValue {
-        public CacheValue(Object object) {
-            this.object = object;
+    public static class Value<T> {
+        public Value(T result) {
+            this.result = result;
+        }
+        private T result;
+        public T getResult() {
+            return result;
         }
-        Object object;
     }
     
-    private final Map<CacheKey, CacheValue> cache = Maps.newHashMap();
+    // //////////////////////////////////////
 
+    
+    private final Map<Key, Value<?>> cache = Maps.newHashMap();
+
+    @Programmatic
+    public <T> T execute(final Callable<T> callable, final Class<?> callingClass, final String methodName, final Object... keys) {
+        final Key cacheKey = new Key(callingClass, methodName, keys);
+        return execute(callable, cacheKey);
+    }
+
+    @Programmatic
     @SuppressWarnings("unchecked")
-    public <T> T execute(Callable<T> callable, Class<?> callingClass, String methodName, Object... keys) {
+    public <T> T execute(final Callable<T> callable, final Key cacheKey) {
         try {
-            final CacheKey ck = new CacheKey(callingClass, methodName, keys);
-            final CacheValue cv = cache.get(ck);
-            if(cv != null) { 
-                return (T) cv.object;
+            final Value<?> cacheValue = cache.get(cacheKey);
+            logHitOrMiss(cacheKey, cacheValue);
+            if(cacheValue != null) { 
+                return (T) cacheValue.getResult();
             }
             // cache miss, so get the result, and cache
             T result = callable.call();
-            cache.put(ck, new CacheValue(result));
+            put(cacheKey, result);
             return result;
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }
 
+    @Programmatic
+    public <T> QueryResultsCache.Value<T> get(final Class<?> callingClass, final String methodName, final Object... keys) {
+        return get(new Key(callingClass, methodName, keys));
+    }
+    
+    @Programmatic
+    @SuppressWarnings("unchecked")
+    public <T> QueryResultsCache.Value<T> get(final QueryResultsCache.Key cacheKey) {
+        Value<T> value = (Value<T>) cache.get(cacheKey);
+        logHitOrMiss(cacheKey, value);
+        return value;
+    }
+
+    @Programmatic
+    public <T> void put(final Key cacheKey, final T result) {
+        if(LOG.isDebugEnabled()) {
+            LOG.debug("PUT: " + cacheKey);
+        }
+        cache.put(cacheKey, new Value<T>(result));
+    }
+
+    private static void logHitOrMiss(final Key cacheKey, final Value<?> cacheValue) {
+        if(!LOG.isDebugEnabled()) { 
+            return; 
+        } 
+        String hitOrMiss = cacheValue != null ? "HIT" : "MISS";
+        LOG.debug( hitOrMiss + ": " + cacheKey.toString());
+    }
+
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ec91d22a/core/applib/src/test/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache_KeyTest.java
----------------------------------------------------------------------
diff --git a/core/applib/src/test/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache_KeyTest.java b/core/applib/src/test/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache_KeyTest.java
new file mode 100644
index 0000000..2bd5e29
--- /dev/null
+++ b/core/applib/src/test/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache_KeyTest.java
@@ -0,0 +1,20 @@
+package org.apache.isis.applib.services.queryresultscache;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+
+public class QueryResultsCache_KeyTest {
+
+    private QueryResultsCache.Key cacheKey;
+
+    static class A {}
+    @Test
+    public void toStringIs() {
+
+        cacheKey = new QueryResultsCache.Key(A.class, "foo", "key1", 2, 3, "key4");
+        assertThat(cacheKey.toString(), is("org.apache.isis.applib.services.queryresultscache.QueryResultsCache_KeyTest$A#foo[key1, 2, 3, key4]"));
+    }
+
+}


[2/2] git commit: ISIS-651: further changes for JRebel support

Posted by da...@apache.org.
ISIS-651: further changes for JRebel support

provide ability to discard PMF

additions to SimpleApp with the JRebel config.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/6b497b0c
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/6b497b0c
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/6b497b0c

Branch: refs/heads/master
Commit: 6b497b0ca8f9bf20fcef0ad54db9c0d3a8971346
Parents: ec91d22
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 22 22:03:08 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 22 22:03:08 2014 +0000

----------------------------------------------------------------------
 .../DataNucleusApplicationComponents.java       | 59 ++++++++++++++++----
 ...ataNucleusPersistenceMechanismInstaller.java |  8 +--
 ...tenceQueryFindUsingApplibQueryProcessor.java |  7 +--
 component/objectstore/jdo/pom.xml               | 12 +++-
 .../dom/src/main/java/dom/todo/ToDoItem.java    |  1 +
 .../src/main/java/dom/simple/SimpleObject.java  | 10 ++--
 .../src/main/java/dom/simple/SimpleObjects.java |  7 +--
 .../dom/src/main/resources/rebel.xml            |  9 +++
 .../launch/SimpleApp-PROTOTYPE-jrebel.launch    | 31 ++++++++++
 .../webapp/src/main/resources/rebel.xml         | 21 +++++++
 10 files changed, 136 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/6b497b0c/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
index cf4e41c..18cb6ad 100644
--- a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
+++ b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.objectstore.jdo.datanucleus;
 
-import java.util.Collections;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
@@ -32,6 +31,7 @@ import com.google.common.collect.Maps;
 
 import org.datanucleus.NucleusContext;
 import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
+import org.datanucleus.metadata.MetaDataManager;
 import org.datanucleus.store.schema.SchemaAwareStoreManager;
 
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
@@ -44,20 +44,63 @@ import org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoQueryFac
 
 public class DataNucleusApplicationComponents implements ApplicationScopedComponent {
 
-    private final PersistenceManagerFactory persistenceManagerFactory;
-    private final Map<String, JdoNamedQuery> namedQueryByName;
+
+    ///////////////////////////////////////////////////////////////////////////
+    // JRebel support
+    ///////////////////////////////////////////////////////////////////////////
+
+    private static DataNucleusApplicationComponents instance;
     
-    private final IsisLifecycleListener lifecycleListener;
-    private final FrameworkSynchronizer synchronizer;
+    /**
+     * For JRebel plugin
+     */
+    public static MetaDataManager getMetaDataManager() {
+        return instance != null
+                ? ((JDOPersistenceManagerFactory)instance.persistenceManagerFactory).getNucleusContext().getMetaDataManager() 
+                : null;
+    }
+
+    public static void markAsStale() {
+        if(instance != null) {
+            instance.stale = true;
+        }
+    }
 
+    private boolean stale = false;
+    public boolean isStale() {
+        return stale;
+    }
 
     ///////////////////////////////////////////////////////////////////////////
     //
     ///////////////////////////////////////////////////////////////////////////
+    
+    private final Set<String> persistableClassNameSet;
+    private final Map<String, String> props;
+    
+    private final IsisLifecycleListener lifecycleListener;
+    private final FrameworkSynchronizer synchronizer;
+    
+    private Map<String, JdoNamedQuery> namedQueryByName;
+    private PersistenceManagerFactory persistenceManagerFactory;
 
     public DataNucleusApplicationComponents(
             final Map<String, String> props, 
             final Set<String> persistableClassNameSet) {
+    
+        this.props = props;
+        this.persistableClassNameSet = persistableClassNameSet;
+
+        this.synchronizer = new FrameworkSynchronizer();
+        this.lifecycleListener = new IsisLifecycleListener(synchronizer);
+
+        init(props, persistableClassNameSet);
+        
+        // for JRebel plugin
+        instance = this;
+    }
+
+    private void init(final Map<String, String> props, final Set<String> persistableClassNameSet) {
         final String persistableClassNames = Joiner.on(',').join(persistableClassNameSet);
         
         props.put("datanucleus.autoStartClassNames", persistableClassNames);
@@ -68,10 +111,8 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
             createSchema(props, persistableClassNameSet);
         }
 
-        namedQueryByName = Collections.unmodifiableMap(catalogNamedQueries(persistableClassNameSet));
+        namedQueryByName = catalogNamedQueries(persistableClassNameSet);
 
-        synchronizer = new FrameworkSynchronizer();
-        lifecycleListener = new IsisLifecycleListener(synchronizer);
     }
     
     public PersistenceManagerFactory getPersistenceManagerFactory() {
@@ -157,6 +198,4 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
         lifecycleListener.setSuspended(false);
     }
 
-
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6b497b0c/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
index 92e8f22..eea7d7d 100644
--- a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
+++ b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
@@ -112,7 +112,10 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani
     }
 
     private void createDataNucleusApplicationComponentsIfRequired(IsisConfiguration configuration) {
-        if(applicationComponents != null) {
+        // this is, perhaps doing more work than necessary...
+        // maybe retain the applicationComponents and just tell it to discard its PMF?
+        // (doubt will make much different in terms of the amount of time to process, though)
+        if(applicationComponents != null && !applicationComponents.isStale()) {
             return;
         }
         
@@ -248,7 +251,6 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani
         return new DataNucleusPojoRecreator();
     }
 
-    
     ////////////////////////////////////////////////////////////////////////
 
     public PersistenceManagerFactory getPersistenceManagerFactory() {
@@ -263,6 +265,4 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani
         return IsisContext.getSpecificationLoader();
     }
 
-
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6b497b0c/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
index d1c49ef..7f611f1 100644
--- a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
+++ b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
@@ -32,11 +32,9 @@ import org.slf4j.LoggerFactory;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
-import org.apache.isis.core.metamodel.spec.ObjectAdapterUtils;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
-import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore;
 import org.apache.isis.objectstore.jdo.datanucleus.metamodel.JdoPropertyUtils;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.FrameworkSynchronizer;
 
@@ -82,7 +80,7 @@ public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQu
         jdoQuery.addExtension("datanucleus.multivaluedFetch", "none");
         
         if (LOG.isDebugEnabled()) {
-            LOG.debug("query: " + queryName + ", filter: " + filter);
+            LOG.debug(cls.getName() + " # " + queryName + " ( " + filter + " )");
         }
         
         return (List<?>) jdoQuery.execute();
@@ -107,7 +105,7 @@ public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQu
         }
         
         if (LOG.isDebugEnabled()) {
-            LOG.debug("query: " + queryName + ", args: " + argumentsByParameterName);
+            LOG.debug(cls.getName() + " # " + queryName + " ( " + argumentsByParameterName + " )");
         }
         
         final List<?> results = (List<?>) jdoQuery.executeWithMap(argumentsByParameterName);
@@ -127,7 +125,6 @@ public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQu
         return argumentsByParameterName;
     }
 
-
 }
 
 // Copyright (c) Naked Objects Group Ltd.

http://git-wip-us.apache.org/repos/asf/isis/blob/6b497b0c/component/objectstore/jdo/pom.xml
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/pom.xml b/component/objectstore/jdo/pom.xml
index 8e980f0..2fe0078 100644
--- a/component/objectstore/jdo/pom.xml
+++ b/component/objectstore/jdo/pom.xml
@@ -57,7 +57,17 @@
         </pluginRepository>
     </pluginRepositories>
 
-	<modules>
+    <repositories>
+        <repository>
+            <id>datanucleus-nightly</id>
+            <url>http://www.datanucleus.org/downloads/maven2-nightly/</url>
+            <snapshots>
+              <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <modules>
 		<module>jdo-applib</module>
 		<module>jdo-metamodel</module>
 		<module>jdo-datanucleus</module>

http://git-wip-us.apache.org/repos/asf/isis/blob/6b497b0c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
index ebc214c..24ae46b 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
@@ -588,6 +588,7 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     // totalCost
     // //////////////////////////////////////
 
+    @ActionSemantics(Of.SAFE)
     @Bulk(AppliesTo.BULK_ONLY)
     public BigDecimal totalCost() {
         BigDecimal total = (BigDecimal) scratchpad.get("runningTotal");

http://git-wip-us.apache.org/repos/asf/isis/blob/6b497b0c/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java
index cdbca56..903a0ab 100644
--- a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java
+++ b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java
@@ -24,6 +24,8 @@ import javax.jdo.annotations.VersionStrategy;
 
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.Bookmarkable;
+import org.apache.isis.applib.annotation.Disabled;
+import org.apache.isis.applib.annotation.Hidden;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.ObjectType;
@@ -48,9 +50,9 @@ public class SimpleObject implements Comparable<SimpleObject> {
     
     private String name;
 
-    @Named("whatever")
     @javax.jdo.annotations.Column(allowsNull="false")
-    @Title
+    @Title(sequence="1")
+    @MemberOrder(sequence="1")
     public String getName() {
         return name;
     }
@@ -58,8 +60,8 @@ public class SimpleObject implements Comparable<SimpleObject> {
     public void setName(final String name) {
         this.name = name;
     }
-
-
+    
+    
 
     // //////////////////////////////////////
     // compareTo

http://git-wip-us.apache.org/repos/asf/isis/blob/6b497b0c/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
index e106f89..3d16e78 100644
--- a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
+++ b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
@@ -27,16 +27,13 @@ import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.applib.annotation.Bookmarkable;
+import org.apache.isis.applib.annotation.Hidden;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Named;
+import org.apache.isis.applib.annotation.Programmatic;
 
 public class SimpleObjects {
 
-    @PostConstruct
-    public void init(Map<String,String> props) {
-        List<SimpleObject> x = container.allInstances(SimpleObject.class);
-        System.out.println(x);
-    }
 
     // //////////////////////////////////////
     // Identification in the UI

http://git-wip-us.apache.org/repos/asf/isis/blob/6b497b0c/example/application/simple_wicket_restful_jdo/dom/src/main/resources/rebel.xml
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/dom/src/main/resources/rebel.xml b/example/application/simple_wicket_restful_jdo/dom/src/main/resources/rebel.xml
new file mode 100644
index 0000000..7fcb2f4
--- /dev/null
+++ b/example/application/simple_wicket_restful_jdo/dom/src/main/resources/rebel.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd">
+
+	<classpath>
+		<dir name="C:/APACHE/isis-git-rw/example/application/simple_wicket_restful_jdo/dom/target-ide/classes">
+		</dir>
+	</classpath>
+
+</application>

http://git-wip-us.apache.org/repos/asf/isis/blob/6b497b0c/example/application/simple_wicket_restful_jdo/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch b/example/application/simple_wicket_restful_jdo/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch
new file mode 100644
index 0000000..6cb899f
--- /dev/null
+++ b/example/application/simple_wicket_restful_jdo/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<mapAttribute key="org.eclipse.debug.core.preferred_launchers">
+<mapEntry key="[debug]" value="org.eclipse.jdt.launching.localJavaApplication"/>
+<mapEntry key="[run]" value="org.eclipse.jdt.launching.localJavaApplication"/>
+</mapAttribute>
+<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
+<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;sourceLookupDirector&gt;&#13;&#10;&lt;sourceContainers duplicates=&quot;false&quot;&gt;&#13;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#13;&amp;#10;&amp;lt;javaProject name=&amp;quot;isis-jrebel-plugin&amp;quot;/&amp;gt;&amp;#13;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.javaProject&quot;/&gt;&#13;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#13;&amp;#10;&amp;lt;default/&amp;gt;&amp;#13;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.default&quot;/&gt;&#13;&#10;&lt;/sourceContainers&gt;&#13;&#10;&lt;/sourceLookupDirector&gt;&#13;&#10
 ;"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry path=&quot;3&quot; projectName=&quot;simple_wicket_restful_jdo-webapp&quot; type=&quot;1&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.apache.isis.WebServer"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="--port 8080 --type PROTOTYPE"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="simple_wicket_restful_jdo-webapp"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="${jrebel_args} -Drebel.log=false -Drebel.plugins=c:/github/danhaywood/isis-jrebel-plugin/target/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar -Disis-jrebel-plugin.packagePrefix=dom.simple"/>
+</launchConfiguration>

http://git-wip-us.apache.org/repos/asf/isis/blob/6b497b0c/example/application/simple_wicket_restful_jdo/webapp/src/main/resources/rebel.xml
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/webapp/src/main/resources/rebel.xml b/example/application/simple_wicket_restful_jdo/webapp/src/main/resources/rebel.xml
new file mode 100644
index 0000000..c65bad2
--- /dev/null
+++ b/example/application/simple_wicket_restful_jdo/webapp/src/main/resources/rebel.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd">
+
+	<classpath>
+		<dir name="C:/APACHE/isis-git-rw/example/application/simple_wicket_restful_jdo/webapp/target-ide/classes">
+		</dir>
+	</classpath>
+
+	<web>
+		<link target="/">
+			<dir name="C:/APACHE/isis-git-rw/example/application/simple_wicket_restful_jdo/webapp/target-ide/m2e-wtp/web-resources">
+				<exclude name="/"/>
+			</dir>
+		</link>
+		<link target="/">
+			<dir name="C:/APACHE/isis-git-rw/example/application/simple_wicket_restful_jdo/webapp/src/main/webapp">
+			</dir>
+		</link>
+	</web>
+
+</application>