Dev Mode exception not seen in Live

116 views
Skip to first unread message

BenjiBoy

unread,
Feb 7, 2012, 7:47:56 PM2/7/12
to twig-persist
Hi

Im seeing an exception when trying to load using Twig (see below) that
I dont see in Live.

My colleague also doesn't see it and yet we have the same dev set up
(although he runs on Mac)

The item it is failing on is an ArrayList<ContactStatus> where
ContactStatus is a simple enum (see below), here's the model
declaration

List<ContactStatus> contactStatuses = new ArrayList<ContactStatus>();

So as I understand it this should just work out of the box?

No @Child annotation etc needed? (indeed adding @Embedded seems to
cause issue35 : http://code.google.com/p/twig-persist/issues/detail?id=35)

When I run a debug session this seems to be failing because ArrayList
does not implement Comparable (since enums always do)

What are we doing wrong?!

Thanks in advance
Ben


Versions:

Java 1.6
Twig 2.0-beta3
AppEngine 1.6.2.1
GWT 2.4.0




The enum is simply:

public enum ContactStatus implements IsSerializable, Serializable {
Public, Secret, Blocked, Ignored;
}


The exception that we see in dev :

java.lang.IllegalArgumentException: Cannot compare [SimpleProperty
value=[Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Blocked, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Blocked, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Blocked, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Blocked, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Blocked, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Blocked, Ignored, Ignored, Ignored, Ignored,
Ignored, Blocked, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Blocked, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored] path=contactStatuses
indexed=false] with [SimpleProperty value=[Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Blocked, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Blocked,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Blocked, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Blocked,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Blocked, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Blocked,
Ignored, Ignored, Ignored, Ignored, Ignored, Blocked, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Blocked, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored, Ignored, Ignored, Ignored, Ignored, Ignored,
Ignored, Ignored] path=contactStatuses indexed=false]
at
com.google.code.twig.util.PropertyComparator.compare(PropertyComparator.java:
23)
at
com.google.code.twig.util.PropertyComparator.compare(PropertyComparator.java:
7)
at java.util.TreeMap.compare(TreeMap.java:1188)
at java.util.TreeMap.put(TreeMap.java:531)
at java.util.TreeSet.add(TreeSet.java:255)
at java.util.AbstractCollection.addAll(AbstractCollection.java:334)
at java.util.TreeSet.addAll(TreeSet.java:312)
at
com.google.code.twig.standard.StandardDecodeCommand.entityToInstance(StandardDecodeCommand.java:
60)
at
com.google.code.twig.standard.StandardDecodeCommand.keyToInstance(StandardDecodeCommand.java:
127)
at
com.google.code.twig.standard.StandardSingleTypedLoadCommand.keyToInstance(StandardSingleTypedLoadCommand.java:
9)
at
com.google.code.twig.standard.StandardSingleTypedLoadCommand.now(StandardSingleTypedLoadCommand.java:
34)
at
com.google.code.twig.standard.TranslatorObjectDatastore.load(TranslatorObjectDatastore.java:
202)
at
com.recruitmentlink.server.persistence.twig.TwigProfileImpl.getExistingCandidate(TwigProfileImpl.java:
92)
at
com.recruitmentlink.server.social.userhandling.UserProfileHandler.getCandidateUserState(UserProfileHandler.java:
49)
at
com.recruitmentlink.server.dispatch.GetCandidateUserStateHandler.executeInternal(GetCandidateUserStateHandler.java:
53)
at
com.recruitmentlink.server.dispatch.GetCandidateUserStateHandler.executeInternal(GetCandidateUserStateHandler.java:
1)
at
com.recruitmentlink.server.dispatch.AbstractActionHandler.execute(AbstractActionHandler.java:
35)
at
com.gwtplatform.dispatch.server.AbstractDispatchImpl.doExecute(AbstractDispatchImpl.java:
153)
at
com.gwtplatform.dispatch.server.AbstractDispatchImpl.execute(AbstractDispatchImpl.java:
111)
at
com.gwtplatform.dispatch.server.AbstractDispatchServiceImpl.execute(AbstractDispatchServiceImpl.java:
80)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
57)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
43)
at java.lang.reflect.Method.invoke(Method.java:601)
at
com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:
104)
at
com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:
569)
at
com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:
208)
at
com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:
248)
at
com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:
62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at
com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:
261)
at
com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:
175)
at
com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:
91)
at
com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:
62)
at
com.gwtplatform.dispatch.server.AbstractHttpSessionSecurityCookieFilter.doFilter(AbstractHttpSessionSecurityCookieFilter.java:
67)
at
com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:
162)
at
com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:
58)
at
com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:
118)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:
113)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
at
com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:
35)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
at
com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:
60)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
at
com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:
43)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
at
com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:
122)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
at
com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:
97)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
at
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:
388)
at
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:
216)
at
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:
182)
at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:
765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:
418)
at
com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:
78)
at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
152)
at com.google.appengine.tools.development.JettyContainerService
$ApiProxyHandler.handle(JettyContainerService.

John Patterson

unread,
Feb 8, 2012, 3:13:15 AM2/8/12
to twig-p...@googlegroups.com
Hmm… interesting.  Thanks for the detailed report.  I have not seen this before.

This should only be able to happen if two properties have the same path which should not be possible.  The stack trace shows that both properties have path "contactStatuses".

Are you able to debug to see how they both get into the "Set<Property> properties" in the first place?

In any case, I can't now see a reason why the property values also needed to be compared (only the path should be important here) so I have removed the value comparison and the unit tests still pass :)

You will need to build from the latest source 


I am still puzzled about how this happens in dev mode in the first place!

BenjiBoy

unread,
Feb 8, 2012, 6:45:17 PM2/8/12
to twig-persist
Thanks John!

Was a bit worried about Twig being a one-man project at first but I
soon saw how responsive you are in the forums and that swayed us in
choosing Twig. So thanks again! Good work!

I'll run a debug session and report back..
> ...
>
> read more »

BenjiBoy

unread,
Feb 8, 2012, 6:58:23 PM2/8/12
to twig-persist
Hi John

You made me think this must be the problem, that there is a difference
in the TreeMap implementation.. (scroll down for summary)

Here's the full stack trace:


Thread [1386348360@qtp-1930651232-5] (Suspended (breakpoint at line 23
in PropertyComparator))
PropertyComparator.compare(Property, Property) line: 23
PropertyComparator.compare(Object, Object) line: 7
TreeMap<K,V>.compare(Object, Object) line: 1188
TreeMap<K,V>.put(K, V) line: 531

.. it's this part of the put :

compare(key, key); // type (and possibly null) check


Since you didnt seem to see that happening I knew I must have
different code to you.

I am running JDK7, started playing with it the other day and forgot!

So basically you are now with you latest code change Java 7 compliant
- well done !

:)

Thanks again!

On Feb 8, 8:13 am, John Patterson <jdpatter...@gmail.com> wrote:
> > com.google.code.twig.util.PropertyComparator.compare(PropertyComparator.jav a:
> > 23)
> >    at
> > com.google.code.twig.util.PropertyComparator.compare(PropertyComparator.jav a:
> > 7)
> >    at java.util.TreeMap.compare(TreeMap.java:1188)
> >    at java.util.TreeMap.put(TreeMap.java:531)
> >    at java.util.TreeSet.add(TreeSet.java:255)
> >    at java.util.AbstractCollection.addAll(AbstractCollection.java:334)
> >    at java.util.TreeSet.addAll(TreeSet.java:312)
> >    at
> > 80)
> >    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >    at
> > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
> > 57)
> >    at
> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp l.java:
> > 43)
> >    at java.lang.reflect.Method.invoke(Method.java:601)
> >    at
> > com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime .java:
> > 104)
> >    at
> > com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:
> > 569)
> >    at
> > com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServi ceServlet.java:
> > 208)
> >    at
> > com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServi ceServlet.java:
> > 248)
> >    at
> > com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(Abstract RemoteServiceServlet.java:
> > 62)
> >    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
> >    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
> >    at
> > com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.jav a:
> > 261)
> >    at
> > com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:
> > 175)
> >    at
> > com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipe line.java:
> > 91)
> >    at
> > com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocat ion.java:
> > 62)
> >    at
> > com.gwtplatform.dispatch.server.AbstractHttpSessionSecurityCookieFilter.doF ilter(AbstractHttpSessionSecurityCookieFilter.java:
> > 67)
> >    at
> > com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:
> > 162)
> >    at
> > com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocat ion.java:
> > 58)
> >    at
> > com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipel ine.java:
> ...
>
> read more »

sharking

unread,
Jul 31, 2013, 11:35:33 AM7/31/13
to twig-p...@googlegroups.com
hi BenjiBoy

  Now GAE use JDK1.7 by default, I encountered the same issue on the server side, you mentioned "So basically you are now with you latest code change Java 7 compliant ", Did you solve the problem without switching back to JDK1.6? If the twig source code have been modified, could you tell me where the newest source is ? I didn't see any source change on Google code since 2011.

sharking

unread,
Jul 31, 2013, 11:43:05 AM7/31/13
to twig-p...@googlegroups.com
Sorry Guys, my mistake, I found I miss the updated source, haven't update it for 2 years. :) I am so happy to see the project is still alive, love Twig!
Reply all
Reply to author
Forward
0 new messages