Repository: isis Updated Branches: refs/heads/master 8bc8bfc29 -> f19cbe239
ISIS-756: improvements for JRebel support specifically: * updated the pom.xml for archetypes, adding -P jrebel antrun:run * updates to .launch files for archetypes, using properties to parameterize the rebel.xml file in the dom project * auto-invalidate cache if fail to retrieve association in metamodel Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/8b1810a0 Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/8b1810a0 Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/8b1810a0 Branch: refs/heads/master Commit: 8b1810a04761b058397d724d06db36cdc99ff919 Parents: 8bc8bfc Author: Dan Haywood <[email protected]> Authored: Sun Mar 23 09:50:14 2014 +0000 Committer: Dan Haywood <[email protected]> Committed: Sun Mar 23 09:50:14 2014 +0000 ---------------------------------------------------------------------- .../runtimecontext/RuntimeContextAbstract.java | 5 + .../metamodel/spec/SpecificationLoader.java | 2 + .../spec/SpecificationLoaderDelegator.java | 12 +-- .../specimpl/ObjectSpecificationAbstract.java | 38 ++++++- .../launch/ToDoApp-PROTOTYPE-jrebel.launch | 2 +- .../webapp/pom.xml | 100 +++++++++++++++--- .../launch/SimpleApp-PROTOTYPE-jrebel.launch | 2 +- .../simple_wicket_restful_jdo/webapp/pom.xml | 101 ++++++++++++++++--- 8 files changed, 222 insertions(+), 40 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/8b1810a0/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java index 855fc39..6f41fe3 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java @@ -141,6 +141,11 @@ public abstract class RuntimeContextAbstract implements RuntimeContext, Specific public List<Class<?>> getServiceClasses() { return specificationLoader.getServiceClasses(); } + + @Override + public void invalidateCache(Class<?> domainClass) { + specificationLoader.invalidateCache(domainClass); + } }); } http://git-wip-us.apache.org/repos/asf/isis/blob/8b1810a0/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java index 737b1c0..a3c5a7c 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java @@ -79,4 +79,6 @@ public interface SpecificationLoader extends Injectable { boolean loaded(String fullyQualifiedClassName); + void invalidateCache(Class<?> domainClass); + } http://git-wip-us.apache.org/repos/asf/isis/blob/8b1810a0/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java index 89b89c8..ad1ad68 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java @@ -31,8 +31,6 @@ public class SpecificationLoaderDelegator extends SpecificationLoaderAbstract { this.specificationLoaderDelegate = specificationLoaderDelegate; } - - @Override public ObjectSpecification loadSpecification(final Class<?> cls) { if (specificationLoaderDelegate == null) { @@ -87,7 +85,11 @@ public class SpecificationLoaderDelegator extends SpecificationLoaderAbstract { return specificationLoaderDelegate.getServiceClasses(); } - + @Override + public void invalidateCache(Class<?> domainClass) { + specificationLoaderDelegate.invalidateCache(domainClass); + } + @Override public void injectInto(Object candidate) { super.injectInto(candidate); @@ -98,8 +100,4 @@ public class SpecificationLoaderDelegator extends SpecificationLoaderAbstract { - - - - } http://git-wip-us.apache.org/repos/asf/isis/blob/8b1810a0/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java index fca48aa..ae5bc97 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java @@ -88,6 +88,8 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecificationException; import org.apache.isis.core.metamodel.spec.Persistability; import org.apache.isis.core.metamodel.spec.SpecificationContext; import org.apache.isis.core.metamodel.spec.SpecificationLoader; +import org.apache.isis.core.metamodel.spec.SpecificationLoader; +import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi; import org.apache.isis.core.metamodel.spec.feature.Contributed; import org.apache.isis.core.metamodel.spec.feature.ObjectAction; import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter; @@ -670,6 +672,11 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem } + private static ThreadLocal<Boolean> invalidatingCache = new ThreadLocal<Boolean>() { + protected Boolean initialValue() { + return Boolean.FALSE; + }; + }; /** * The association with the given {@link ObjectAssociation#getId() id}. @@ -687,12 +694,41 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem */ @Override public ObjectAssociation getAssociation(final String id) { + ObjectAssociation oa = getAssociationWithId(id); + if(oa != null) { + return oa; + } + if(!getDeploymentCategory().isProduction()) { + // automatically refresh if not in production + // (better support for jrebel) + + LOG.warn("Could not find association with id '" + id + "'; invalidating cache automatically"); + if(!invalidatingCache.get()) { + // make sure don't go into an infinite loop, though. + try { + invalidatingCache.set(true); + getSpecificationLookup().invalidateCache(getCorrespondingClass()); + } finally { + invalidatingCache.set(false); + } + } else { + LOG.warn("... already invalidating cache earlier in stacktrace, so skipped this time"); + } + oa = getAssociationWithId(id); + if(oa != null) { + return oa; + } + } + throw new ObjectSpecificationException("No association called '" + id + "' in '" + getSingularName() + "'"); + } + + private ObjectAssociation getAssociationWithId(final String id) { for (final ObjectAssociation objectAssociation : getAssociations(Contributed.INCLUDED)) { if (objectAssociation.getId().equals(id)) { return objectAssociation; } } - throw new ObjectSpecificationException("No association called '" + id + "' in '" + getSingularName() + "'"); + return null; } @Deprecated http://git-wip-us.apache.org/repos/asf/isis/blob/8b1810a0/example/application/quickstart_wicket_restful_jdo/webapp/ide/eclipse/launch/ToDoApp-PROTOTYPE-jrebel.launch ---------------------------------------------------------------------- diff --git a/example/application/quickstart_wicket_restful_jdo/webapp/ide/eclipse/launch/ToDoApp-PROTOTYPE-jrebel.launch b/example/application/quickstart_wicket_restful_jdo/webapp/ide/eclipse/launch/ToDoApp-PROTOTYPE-jrebel.launch index fb34b64..39cabb7 100644 --- a/example/application/quickstart_wicket_restful_jdo/webapp/ide/eclipse/launch/ToDoApp-PROTOTYPE-jrebel.launch +++ b/example/application/quickstart_wicket_restful_jdo/webapp/ide/eclipse/launch/ToDoApp-PROTOTYPE-jrebel.launch @@ -20,5 +20,5 @@ <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="--port 8080 --type SERVER_PROTOTYPE"/> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="quickstart_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=true -Drebel.plugins=c:/github/danhaywood/isis-jrebel-plugin/target/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar -Disis-jrebel-plugin.packagePrefix=dom.todo,org.apache.isis.objectstore.jdo.applib -Disis-jrebel-plugin.loggingLevel=warn -XX:MaxPermSize=128m"/> +<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="${jrebel_args} -Drebel.log=false -Drebel.check_class_hash=true -Drebel.packages_exclude=org.apache.isis -Dproject.root=${project_loc}/.. -Dtarget.dir=target-ide -Drebel.plugins=C:/github/danhaywood/isis-jrebel-plugin/target/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar -Disis-jrebel-plugin.packagePrefix=dom.todo,org.apache.isis.objectstore.jdo.applib -Disis-jrebel-plugin.loggingLevel=warn -XX:MaxPermSize=128m"/> </launchConfiguration> http://git-wip-us.apache.org/repos/asf/isis/blob/8b1810a0/example/application/quickstart_wicket_restful_jdo/webapp/pom.xml ---------------------------------------------------------------------- diff --git a/example/application/quickstart_wicket_restful_jdo/webapp/pom.xml b/example/application/quickstart_wicket_restful_jdo/webapp/pom.xml index 4df8c2e..5ee7200 100644 --- a/example/application/quickstart_wicket_restful_jdo/webapp/pom.xml +++ b/example/application/quickstart_wicket_restful_jdo/webapp/pom.xml @@ -60,21 +60,6 @@ </executions> </plugin> - <!-- prereqs: mvn package --> - <!-- mvn antrun:run --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-antrun-plugin</artifactId> - <configuration> - <tasks> - <exec executable="java" failonerror="true"> - <arg value="-jar" /> - <arg value="${project.build.directory}/${project.build.finalName}-jetty-console.war" /> - </exec> - </tasks> - </configuration> - </plugin> - <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> @@ -278,4 +263,89 @@ </dependencies> + <profiles> + <profile> + <id>self-host</id> + <build> + <plugins> + <!-- + mvn -P self-host antrun:run + --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-antrun-plugin</artifactId> + <configuration> + <tasks> + <exec executable="java" failonerror="true"> + <arg value="-jar" /> + <arg value="${project.build.directory}/${project.build.finalName}-jetty-console.war" /> + </exec> + </tasks> + </configuration> + </plugin> + </plugins> + </build> + </profile> + + <profile> + <id>jrebel</id> + <properties> + <!-- as used in the rebel.xml in the dom project --> + <target.dir>target</target.dir> + <isis-jrebel-plugin.packagePrefix>dom.todo,org.apache.isis.objectstore.jdo.applib</isis-jrebel-plugin.packagePrefix> + <isis-jrebel-plugin.loggingLevel>warn</isis-jrebel-plugin.loggingLevel> + </properties> + <build> + <plugins> + <!-- + mvn -P jrebel antrun:run \ + -Djrebel.jar="C:/Users/Dan/.IdeaIC13/config/plugins/jr-ide-idea/lib/jrebel/jrebel.jar" \ + -Disis_jrebel_plugin.jar="C:/github/danhaywood/isis-jrebel-plugin/target/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar" + --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-antrun-plugin</artifactId> + <configuration> + <target> + <property name="compile_classpath" refid="maven.compile.classpath"/> + <property name="runtime_classpath" refid="maven.runtime.classpath"/> + <property name="test_classpath" refid="maven.test.classpath"/> + <property name="plugin_classpath" refid="maven.plugin.classpath"/> + + <echo message=""/> + <echo message=""/> + <echo message="jrebel.jar = ${jrebel.jar}"/> + <echo message="isis_jrebel_plugin.jar = ${isis_jrebel_plugin.jar}"/> + <echo message="target.dir = ${target.dir}"/> + <echo message=""/> + <echo message=""/> + + <exec executable="java" failonerror="true"> + <arg value="-javaagent:${jrebel.jar}"/> + <arg value="-Drebel.log=false"/> + <arg value="-Drebel.check_class_hash=true"/> + <arg value="-Drebel.packages_exclude=org.apache.isis"/> + + <!-- as used in the rebel.xml in the dom project --> + <arg value="-Dproject.root=${project.basedir}/.."/> + <arg value="-Dtarget.dir=${target.dir}"/> + + <arg value="-Drebel.plugins=${isis_jrebel_plugin.jar}"/> + <arg value="-Disis-jrebel-plugin.packagePrefix=${isis-jrebel-plugin.packagePrefix}"/> + <arg value="-Disis-jrebel-plugin.loggingLevel=${isis-jrebel-plugin.loggingLevel}"/> + <arg value="-XX:MaxPermSize=128m"/> + <arg value="-classpath"/> + <arg value="${runtime_classpath}"/> + <arg value="org.apache.isis.WebServer"/> + </exec> + </target> + </configuration> + </plugin> + </plugins> + </build> + </profile> + </profiles> + + + </project> http://git-wip-us.apache.org/repos/asf/isis/blob/8b1810a0/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 index c496303..698333c 100644 --- 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 @@ -27,5 +27,5 @@ <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 -Disis-jrebel-plugin.loggingLevel=warn -XX:MaxPermSize=128m"/> +<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="${jrebel_args} -Drebel.log=false -Drebel.check_class_hash=true -Drebel.packages_exclude=org.apache.isis -Dproject.root=${project_loc}/.. -Dtarget.dir=target-ide -Drebel.plugins=C:/github/danhaywood/isis-jrebel-plugin/target/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar -Disis-jrebel-plugin.packagePrefix=dom.simple,org.apache.isis.objectstore.jdo.applib -Disis-jrebel-plugin.loggingLevel=warn -XX:MaxPermSize=128m"/> </launchConfiguration> http://git-wip-us.apache.org/repos/asf/isis/blob/8b1810a0/example/application/simple_wicket_restful_jdo/webapp/pom.xml ---------------------------------------------------------------------- diff --git a/example/application/simple_wicket_restful_jdo/webapp/pom.xml b/example/application/simple_wicket_restful_jdo/webapp/pom.xml index ff30482..0393109 100644 --- a/example/application/simple_wicket_restful_jdo/webapp/pom.xml +++ b/example/application/simple_wicket_restful_jdo/webapp/pom.xml @@ -60,21 +60,6 @@ </executions> </plugin> - <!-- prereqs: mvn package --> - <!-- mvn antrun:run --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-antrun-plugin</artifactId> - <configuration> - <tasks> - <exec executable="java" failonerror="true"> - <arg value="-jar" /> - <arg value="${project.build.directory}/${project.build.finalName}-jetty-console.war" /> - </exec> - </tasks> - </configuration> - </plugin> - <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> @@ -219,7 +204,9 @@ <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-servlet_2.5_spec</artifactId> + <!-- <scope>provided</scope> + --> </dependency> <!-- @@ -267,4 +254,88 @@ </dependencies> + <profiles> + <profile> + <id>self-host</id> + <build> + <plugins> + <!-- + mvn -P self-host antrun:run + --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-antrun-plugin</artifactId> + <configuration> + <tasks> + <exec executable="java" failonerror="true"> + <arg value="-jar" /> + <arg value="${project.build.directory}/${project.build.finalName}-jetty-console.war" /> + </exec> + </tasks> + </configuration> + </plugin> + </plugins> + </build> + </profile> + + <profile> + <id>jrebel</id> + <properties> + <!-- as used in the rebel.xml in the dom project --> + <target.dir>target</target.dir> + + <isis-jrebel-plugin.packagePrefix>dom.simple,org.apache.isis.objectstore.jdo.applib</isis-jrebel-plugin.packagePrefix> + <isis-jrebel-plugin.loggingLevel>warn</isis-jrebel-plugin.loggingLevel> + </properties> + <build> + <plugins> + <!-- + mvn -P jrebel antrun:run \ + -Djrebel.jar="C:/Users/Dan/.IdeaIC13/config/plugins/jr-ide-idea/lib/jrebel/jrebel.jar" \ + -Disis_jrebel_plugin.jar="C:/github/danhaywood/isis-jrebel-plugin/target/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar" + --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-antrun-plugin</artifactId> + <configuration> + <target> + <property name="compile_classpath" refid="maven.compile.classpath"/> + <property name="runtime_classpath" refid="maven.runtime.classpath"/> + <property name="test_classpath" refid="maven.test.classpath"/> + <property name="plugin_classpath" refid="maven.plugin.classpath"/> + + <echo message=""/> + <echo message=""/> + <echo message="jrebel.jar = ${jrebel.jar}"/> + <echo message="isis_jrebel_plugin.jar = ${isis_jrebel_plugin.jar}"/> + <echo message="target.dir = ${target.dir}"/> + <echo message=""/> + <echo message=""/> + + <exec executable="java" failonerror="true"> + <arg value="-javaagent:${jrebel.jar}"/> + <arg value="-Drebel.log=false"/> + <arg value="-Drebel.check_class_hash=true"/> + <arg value="-Drebel.packages_exclude=org.apache.isis"/> + + <!-- as used in the rebel.xml in the dom project --> + <arg value="-Dproject.root=${project.basedir}/.."/> + <arg value="-Dtarget.dir=${target.dir}"/> + + <arg value="-Drebel.plugins=${isis_jrebel_plugin.jar}"/> + <arg value="-Disis-jrebel-plugin.packagePrefix=${isis-jrebel-plugin.packagePrefix}"/> + <arg value="-Disis-jrebel-plugin.loggingLevel=${isis-jrebel-plugin.loggingLevel}"/> + <arg value="-XX:MaxPermSize=128m"/> + <arg value="-classpath"/> + <arg value="${runtime_classpath}"/> + <arg value="org.apache.isis.WebServer"/> + </exec> + </target> + </configuration> + </plugin> + </plugins> + </build> + </profile> + </profiles> + </project>
