isis-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From GESCONSULTOR - Óscar Bou <o....@gesconsultor.com>
Subject JRebel support
Date Sun, 02 Feb 2014 19:07:34 GMT

Hi, Dan.

I'm very excited about the possibility to use the JRebel plugin, as it can accelerate a lot
the workflow.
I've downloaded and configured it, and I'm working over the latest quickstart archetype.

I've added 1 new property to the TodoItem entity, and it has not been showed on the interface.

These are the detailed steps followed.




1. Quickstart prototype.

I create a new folder and run maven to create a project based on the latest Isis quickstart:

mvn archetype:generate      -D archetypeGroupId=org.apache.isis.archetype     -D archetypeArtifactId=quickstart_wicket_restful_jdo-archetype
    -D archetypeVersion=1.3.1     -D groupId=com.mycompany     -D artifactId=myapp     -D
version=1.0-SNAPSHOT     -B


2. JRebel configuration.

I've installed JRebel, and on the JRebel Config Center I've marked the "dom" and "webapp"
projects. to be followed for changes by JRebel.

I've downloaded from [1] the danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar plugin and copied
it on the lib folder of the "webapp" module.

I've copied the ToDoApp-no-fixtures-PROTOTYPE.launch on the "webapp" module to a new ToDoApp-no-fixtures-PROTOTYPE-Rebel.launch
file, and added:

<stringAttribute 
      key="org.eclipse.jdt.launching.VM_ARGUMENTS" 
      value="${jrebel_args} -Drebel.log=false -Drebel.plugins=./lib/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar
-Disis-jrebel-plugin.packagePrefix=dom.simple -XX:MaxPermSize=128m"/>

3. DataNucleus.

I assume that the "DataNucleus - auto-enhancement" option must be enabled on the "dom" module.
That originates that, each time the Enhancer is executed (that's after any change on any file
on the module) a JRebel dialog asks:
"You are launching a JRebel-enabled application without the JRebel agent. JRebel will not
work without it."
For avoiding that, I've checked the "Don't perform this check again (you can restore it from
preferences)", and have chosen the "Not this time" option. 

4. Run the webapp.

I've launched the newly created Eclipse configuration and navigated to "http://localhost:8080/wicket/".
I've installed the fixtures.

5. Changes in code.

I add a new field to the ToDoItem entity. The following message appears on Eclipse:

Class 'xxx' has a new non-sttic field 'newField', it will be null on existing instances.

But after refreshing the webapp entity page, the field it's not showed. I've waited enough
time. In fact, the following messages have been logged:

2014-02-02 19:56:40 JRebel: Reloading class 'dom.todo.ToDoItem'.
19:56:40,515  [Native               1238094722@qtp-1337505800-5 DEBUG]  SELECT "A0"."category","A0"."complete","A0"."cost","A0"."description","A0"."dueBy","A0"."notes","A0"."ownedBy","A0"."subcategory","A0"."version"
FROM "ToDoItem" "A0" WHERE "A0"."id" = <11>
2014-02-02 19:56:40 JRebel: Reloading class 'dom.todo.ToDoItem$Category'.
2014-02-02 19:56:40 JRebel: Reloading class 'dom.todo.ToDoItem$Category$1'.
2014-02-02 19:56:40 JRebel: Reloading class 'dom.todo.ToDoItem$Subcategory'.
2014-02-02 19:56:40 JRebel: Reloading class 'dom.todo.ToDoItem$Subcategory$1'.
2014-02-02 19:56:40 JRebel: Reinitialized class 'dom.todo.ToDoItem$Subcategory'.
2014-02-02 19:56:40 JRebel: Reinitialized class 'dom.todo.ToDoItem$Category$1'.
2014-02-02 19:56:40 JRebel: Reloading class 'dom.todo.ToDoItem$Category$2'.
2014-02-02 19:56:40 JRebel: Reinitialized class 'dom.todo.ToDoItem$Category$2'.
2014-02-02 19:56:40 JRebel: Reloading class 'dom.todo.ToDoItem$Category$3'.
2014-02-02 19:56:40 JRebel: Reinitialized class 'dom.todo.ToDoItem$Category$3'.
2014-02-02 19:56:40 JRebel: Reinitialized class 'dom.todo.ToDoItem$Category'.
19:56:40,697  [Native               1238094722@qtp-1337505800-5 DEBUG]  SELECT 'dom.todo.ToDoItem'
AS NUCLEUS_TYPE,"A1"."category","A1"."complete","A1"."cost","A1"."description","A1"."dueBy","A1"."notes","A1"."ownedBy","A1"."subcategory","A1"."id","A1"."version"
FROM "ToDoItemDependencies" "A0" INNER JOIN "ToDoItem" "A1" ON "A0"."dependentId" = "A1"."id"
WHERE "A0"."dependingId" = <11>
2014-02-02 19:56:40 JRebel: Reloading class 'dom.todo.ToDoItem$DependenciesComparator'.
2014-02-02 19:56:40 JRebel: Reloading class 'dom.todo.ToDoItem$DependenciesComparator$1'.
19:56:40,771  [Native               1238094722@qtp-1337505800-5 DEBUG]  SELECT 'dom.todo.ToDoItem'
AS NUCLEUS_TYPE,"A0"."category","A0"."complete","A0"."cost","A0"."description","A0"."dueBy","A0"."notes","A0"."ownedBy","A0"."subcategory","A0"."id","A0"."version"
FROM "ToDoItem" "A0" WHERE "A0"."ownedBy" = <'sven'> AND "A0"."category" = <'Professional'>
19:56:40,789  [Native               1238094722@qtp-1337505800-5 DEBUG]  SELECT "A0"."attachment","A0"."version"
FROM "ToDoItem" "A0" WHERE "A0"."id" = <9>
19:56:40,806  [Native               1238094722@qtp-1337505800-5 DEBUG]  SELECT "A0"."attachment","A0"."version"
FROM "ToDoItem" "A0" WHERE "A0"."id" = <10>
19:56:40,812  [Native               1238094722@qtp-1337505800-5 DEBUG]  SELECT "A0"."attachment","A0"."version"
FROM "ToDoItem" "A0" WHERE "A0"."id" = <8>
19:56:41,351  [ResourceServlet      447422450@qtp-1337505800-2 INFO ]  request: css/application.css
19:56:41,351  [ResourceServlet      1203999762@qtp-1337505800-0 INFO ]  request: scripts/application.js
19:56:41,362  [ResourceServlet      1238094722@qtp-1337505800-5 INFO ]  request: images/spinning-icon.gif
 


On this state, if I press Edit and try to change the ToDoItem description, the following exception
is logged:

org.mortbay.jetty.bio.SocketConnector$Connection#run(SocketConnector.java:228)
org.mortbay.thread.QueuedThreadPool$PoolThread#run(QueuedThreadPool.java:582)
java.lang.NullPointerException
org.datanucleus.state.JDOStateManager#setObjectField(JDOStateManager.java:1843)
dom.todo.ToDoItem#setSubcategory(ToDoItem.java:-1)
sun.reflect.NativeMethodAccessorImpl#invoke0(NativeMethodAccessorImpl.java:-2)
sun.reflect.NativeMethodAccessorImpl#invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl#invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method#invoke(Method.java:597)
org.apache.isis.core.commons.lang.MethodExtensions#invoke(MethodExtensions.java:50)
org.apache.isis.core.commons.lang.MethodExtensions#invoke(MethodExtensions.java:45)
org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils#invoke(AdapterInvokeUtils.java:44)
org.apache.isis.core.progmodel.facets.properties.modify.PropertyClearFacetViaSetterMethod#clearProperty(PropertyClearFacetViaSetterMethod.java:62)
org.apache.isis.core.runtime.transaction.facets.PropertyClearFacetWrapTransaction$1#execute(PropertyClearFacetWrapTransaction.java:55)
org.apache.isis.core.runtime.system.transaction.IsisTransactionManager#executeWithinTransaction(IsisTransactionManager.java:175)
org.apache.isis.core.runtime.transaction.facets.PropertyClearFacetWrapTransaction#clearProperty(PropertyClearFacetWrapTransaction.java:52)
org.apache.isis.core.metamodel.specloader.specimpl.OneToOneAssociationImpl#clearValue(OneToOneAssociationImpl.java:200)
org.apache.isis.core.metamodel.specloader.specimpl.OneToOneAssociationImpl#set(OneToOneAssociationImpl.java:164)
org.apache.isis.viewer.wicket.model.models.EntityModel#apply(EntityModel.java:427)
org.apache.isis.viewer.wicket.ui.components.entity.properties.EntityPropertiesForm$2#onSubmit(EntityPropertiesForm.java:365)
org.apache.wicket.markup.html.form.Form#delegateSubmit(Form.java:1253)
org.apache.wicket.markup.html.form.Form#process(Form.java:925)
org.apache.isis.viewer.wicket.ui.panels.FormAbstract#process(FormAbstract.java:118)
org.apache.wicket.markup.html.form.Form#onFormSubmitted(Form.java:771)
org.apache.wicket.markup.html.form.Form#onFormSubmitted(Form.java:704)
sun.reflect.NativeMethodAccessorImpl#invoke0(NativeMethodAccessorImpl.java:-2)
sun.reflect.NativeMethodAccessorImpl#invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl#invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method#invoke(Method.java:597)
org.apache.wicket.RequestListenerInterface#internalInvoke(RequestListenerInterface.java:258)
org.apache.wicket.RequestListenerInterface#invoke(RequestListenerInterface.java:216)
org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler#invokeListener(ListenerInterfaceRequestHandler.java:240)
org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler#respond(ListenerInterfaceRequestHandler.java:226)
org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor#respond(RequestCycle.java:861)
org.apache.wicket.request.RequestHandlerStack#execute(RequestHandlerStack.java:64)
org.apache.wicket.request.cycle.RequestCycle#execute(RequestCycle.java:261)
org.apache.wicket.request.cycle.RequestCycle#processRequest(RequestCycle.java:218)
org.apache.wicket.request.cycle.RequestCycle#processRequestAndDetach(RequestCycle.java:289)
org.apache.wicket.protocol.http.WicketFilter#processRequestCycle(WicketFilter.java:259)
org.apache.wicket.protocol.http.WicketFilter#processRequest(WicketFilter.java:201)
org.apache.wicket.protocol.http.WicketFilter#doFilter(WicketFilter.java:282)
org.mortbay.jetty.servlet.ServletHandler$CachedChain#doFilter(ServletHandler.java:1212)
org.apache.shiro.web.servlet.AbstractShiroFilter#executeChain(AbstractShiroFilter.java:449)
org.apache.shiro.web.servlet.AbstractShiroFilter$1#call(AbstractShiroFilter.java:365)
org.apache.shiro.subject.support.SubjectCallable#doCall(SubjectCallable.java:90)
org.apache.shiro.subject.support.SubjectCallable#call(SubjectCallable.java:83)
org.apache.shiro.subject.support.DelegatingSubject#execute(DelegatingSubject.java:383)
org.apache.shiro.web.servlet.AbstractShiroFilter#doFilterInternal(AbstractShiroFilter.java:362)
org.apache.shiro.web.servlet.OncePerRequestFilter#doFilter(OncePerRequestFilter.java:125)
org.mortbay.jetty.servlet.ServletHandler$CachedChain#doFilter(ServletHandler.java:1212)
org.mortbay.jetty.servlet.ServletHandler#handle(ServletHandler.java:399)
org.mortbay.jetty.security.SecurityHandler#handle(SecurityHandler.java:216)
org.mortbay.jetty.servlet.SessionHandler#handle(SessionHandler.java:182)
org.mortbay.jetty.handler.ContextHandler#__handle(ContextHandler.java:766)
org.mortbay.jetty.handler.ContextHandler#handle(ContextHandler.java:-1)
org.mortbay.jetty.webapp.WebAppContext#handle(WebAppContext.java:450)
org.mortbay.jetty.handler.HandlerWrapper#handle(HandlerWrapper.java:152)
org.mortbay.jetty.Server#handle(Server.java:326)
org.mortbay.jetty.HttpConnection#handleRequest(HttpConnection.java:542)
org.mortbay.jetty.HttpConnection$RequestHandler#content(HttpConnection.java:945)
org.mortbay.jetty.HttpParser#parseNext(HttpParser.java:756)
org.mortbay.jetty.HttpParser#parseAvailable(HttpParser.java:218)
org.mortbay.jetty.HttpConnection#handle(HttpConnection.java:404)
org.mortbay.jetty.bio.SocketConnector$Connection#run(SocketConnector.java:228)
org.mortbay.thread.QueuedThreadPool$PoolThread#run(QueuedThreadPool.java:582)


[1] https://github.com/danhaywood/isis-jrebel-plugin.git
Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message