You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@isis.apache.org by "Dan Haywood (JIRA)" <ji...@apache.org> on 2013/02/22 12:38:12 UTC

[jira] [Resolved] (ISIS-321) gracefully handle any constraint violation thrown by the DataNucleus persistence mechanism (to be handled by JDO ObjectStore & Wicket)

     [ https://issues.apache.org/jira/browse/ISIS-321?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Dan Haywood resolved ISIS-321.
------------------------------

    Resolution: Duplicate
    
> gracefully handle any constraint violation thrown by the DataNucleus persistence mechanism (to be handled by JDO ObjectStore & Wicket)
> --------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: ISIS-321
>                 URL: https://issues.apache.org/jira/browse/ISIS-321
>             Project: Isis
>          Issue Type: Bug
>          Components: Objectstore: JDO, Viewer: Wicket
>    Affects Versions: viewer-wicket-1.1.0, objectstore-jdo-1.0.0
>            Reporter: Jeroen van der Wal
>            Assignee: Dan Haywood
>
> eg: if add the @Unique annotation to a field, should get back a user-friendly message in the action panel (or equally, in the edit object entity page).
> Instead, at the moment going straight to a 500 stack trace (see below as to what we get).
> What we want:
> - need to catch a runtimeexception in the actionPage and the EntityPage in the wicket viewer, and to render in a feedback panel
> Ideas on how to accomplish this:
> - in this particular case, we'd've expected there to be a validate on the action, which (barring a race condition) would have detected the error
> - nevertheless, occasionally race conditions will occur, and/or the domain programmer just forgot to implement the validation
> - in these cases, we'd still like a user friendly message, but perhaps should also log so that the programmer knows about it and can decide if it was a real problem or not
> - thus, could provide some sort of "ErrorHandlingService" that would take an exception and try to generate a sensible message to display; would be a knowledge base of lookup codes, regexs etc.  If none available, then would just use the ex.getMessage()
> - in all cases, the exception would be logged and the progammer/administrator would use a tool such as Nagios/Zabbix etc to do the actual monitoring of the health of the app
> Here's an example of the kind of stack trace that such a service would need to handle:
> javax.jdo.JDODataStoreException: Insert of object "org.estatio.dom.asset.Property@45d0e784" using statement "INSERT INTO PROPERTY (DISPOSALDATE,OPENINGDATE,AREA,"NAME",ACQUIREDATE,"TYPE",REFERENCE) VALUES (?,?,?,?,?,?,?)" failed : integrity constraint violation: unique constraint or index violation; REFERENCE_IDX table: PROPERTY
> 	at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:421)
> 	at org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:736)
> 	at org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:756)
> 	at org.apache.isis.objectstore.jdo.datanucleus.persistence.commands.DataNucleusCreateObjectCommand.execute(DataNucleusCreateObjectCommand.java:53)
> 	at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.executeCommands(DataNucleusObjectStore.java:346)
> 	at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.execute(DataNucleusObjectStore.java:340)
> 	at org.apache.isis.core.runtime.system.transaction.IsisTransaction.doFlush(IsisTransaction.java:350)
> 	at org.apache.isis.core.runtime.system.transaction.IsisTransaction.flush(IsisTransaction.java:314)
> 	at org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel$ResultType$1.addResultsAccordingToSingleResultsMode(ActionPanel.java:194)
> 	at org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel$ResultType$1.addResults(ActionPanel.java:164)
> 	at org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel.executeActionAndProcessResults(ActionPanel.java:133)
> 	at org.apache.isis.viewer.wicket.ui.actions.params.ActionParametersFormPanel$ActionParameterForm$1.onSubmit(ActionParametersFormPanel.java:121)
> 	at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1235)
> 	at org.apache.wicket.markup.html.form.Form.process(Form.java:921)
> 	at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:767)
> 	at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:700)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
> 	at java.lang.reflect.Method.invoke(Unknown Source)
> 	at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258)
> 	at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:216)
> 	at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:240)
> 	at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:226)
> 	at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:830)
> 	at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
> 	at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:253)
> 	at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:210)
> 	at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:281)
> 	at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:188)
> 	at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:245)
> 	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
> 	at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
> 	at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
> 	at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
> 	at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
> 	at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
> 	at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
> 	at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
> 	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
> 	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
> 	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:766)
> 	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
> 	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
> 	at org.mortbay.jetty.Server.handle(Server.java:326)
> 	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
> 	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
> 	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
> 	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
> 	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
> 	at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
> 	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
> NestedThrowablesStackTrace:
> java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: unique constraint or index violation; REFERENCE_IDX table: PROPERTY
> 	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
> 	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
> 	at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
> 	at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
> 	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
> 	at org.datanucleus.store.rdbms.SQLController.executeStatementUpdate(SQLController.java:419)
> 	at org.datanucleus.store.rdbms.request.InsertRequest.execute(InsertRequest.java:411)
> 	at org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertTable(RDBMSPersistenceHandler.java:166)
> 	at org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertObject(RDBMSPersistenceHandler.java:142)
> 	at org.datanucleus.state.JDOStateManager.internalMakePersistent(JDOStateManager.java:2381)
> 	at org.datanucleus.state.JDOStateManager.makePersistent(JDOStateManager.java:2357)
> 	at org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.java:1896)
> 	at org.datanucleus.ObjectManagerImpl.persistObjectWork(ObjectManagerImpl.java:1745)
> 	at org.datanucleus.ObjectManagerImpl.persistObject(ObjectManagerImpl.java:1593)
> 	at org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:731)
> 	at org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:756)
> 	at org.apache.isis.objectstore.jdo.datanucleus.persistence.commands.DataNucleusCreateObjectCommand.execute(DataNucleusCreateObjectCommand.java:53)
> 	at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.executeCommands(DataNucleusObjectStore.java:346)
> 	at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.execute(DataNucleusObjectStore.java:340)
> 	at org.apache.isis.core.runtime.system.transaction.IsisTransaction.doFlush(IsisTransaction.java:350)
> 	at org.apache.isis.core.runtime.system.transaction.IsisTransaction.flush(IsisTransaction.java:314)
> 	at org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel$ResultType$1.addResultsAccordingToSingleResultsMode(ActionPanel.java:194)
> 	at org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel$ResultType$1.addResults(ActionPanel.java:164)
> 	at org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel.executeActionAndProcessResults(ActionPanel.java:133)
> 	at org.apache.isis.viewer.wicket.ui.actions.params.ActionParametersFormPanel$ActionParameterForm$1.onSubmit(ActionParametersFormPanel.java:121)
> 	at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1235)
> 	at org.apache.wicket.markup.html.form.Form.process(Form.java:921)
> 	at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:767)
> 	at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:700)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
> 	at java.lang.reflect.Method.invoke(Unknown Source)
> 	at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258)
> 	at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:216)
> 	at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:240)
> 	at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:226)
> 	at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:830)
> 	at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
> 	at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:253)
> 	at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:210)
> 	at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:281)
> 	at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:188)
> 	at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:245)
> 	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
> 	at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
> 	at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
> 	at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
> 	at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
> 	at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
> 	at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
> 	at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
> 	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
> 	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
> 	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:766)
> 	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
> 	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
> 	at org.mortbay.jetty.Server.handle(Server.java:326)
> 	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
> 	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
> 	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
> 	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
> 	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
> 	at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
> 	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
> Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation; REFERENCE_IDX table: PROPERTY
> 	at org.hsqldb.error.Error.error(Unknown Source)
> 	at org.hsqldb.Constraint.getException(Unknown Source)
> 	at org.hsqldb.index.IndexAVLMemory.insert(Unknown Source)
> 	at org.hsqldb.persist.RowStoreAVL.indexRow(Unknown Source)
> 	at org.hsqldb.TransactionManager2PL.addInsertAction(Unknown Source)
> 	at org.hsqldb.Session.addInsertAction(Unknown Source)
> 	at org.hsqldb.Table.insertSingleRow(Unknown Source)
> 	at org.hsqldb.StatementDML.insertSingleRow(Unknown Source)
> 	at org.hsqldb.StatementInsert.getResult(Unknown Source)
> 	at org.hsqldb.StatementDMQL.execute(Unknown Source)
> 	at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
> 	at org.hsqldb.Session.execute(Unknown Source)
> 	... 65 more
> and also
> org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation; REFERENCE_IDX table: PROPERTY
>      at org.hsqldb.error.Error.error(Unknown Source)
>      at org.hsqldb.Constraint.getException(Unknown Source)
>      at org.hsqldb.index.IndexAVLMemory.insert(Unknown Source)
>      at org.hsqldb.persist.RowStoreAVL.indexRow(Unknown Source)
>      at org.hsqldb.TransactionManager2PL.addInsertAction(Unknown Source)
>      at org.hsqldb.Session.addInsertAction(Unknown Source)
>      at org.hsqldb.Table.insertSingleRow(Unknown Source)
>      at org.hsqldb.StatementDML.insertSingleRow(Unknown Source)
>      at org.hsqldb.StatementInsert.getResult(Unknown Source)
>      at org.hsqldb.StatementDMQL.execute(Unknown Source)
>      at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
>      at org.hsqldb.Session.execute(Unknown Source)
>      at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
>      at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
>      at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
>      at org.datanucleus.store.rdbms.SQLController.executeStatementUpdate(SQLController.java:419)
>      at org.datanucleus.store.rdbms.request.InsertRequest.execute(InsertRequest.java:411)
>      at org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertTable(RDBMSPersistenceHandler.java:166)
>      at org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertObject(RDBMSPersistenceHandler.java:142)
>      at org.datanucleus.state.JDOStateManager.internalMakePersistent(JDOStateManager.java:2381)
>      at org.datanucleus.state.JDOStateManager.makePersistent(JDOStateManager.java:2357)
>      at org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.java:1896)
>      at org.datanucleus.ObjectManagerImpl.persistObjectWork(ObjectManagerImpl.java:1745)
>      at org.datanucleus.ObjectManagerImpl.persistObject(ObjectManagerImpl.java:1593)
>      at org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:731)
>      at org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:756)
>      at org.apache.isis.objectstore.jdo.datanucleus.persistence.commands.DataNucleusCreateObjectCommand.execute(DataNucleusCreateObjectCommand.java:53)
>      at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.executeCommands(DataNucleusObjectStore.java:346)
>      at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.execute(DataNucleusObjectStore.java:340)
>      at org.apache.isis.core.runtime.system.transaction.IsisTransaction.doFlush(IsisTransaction.java:350)
>      at org.apache.isis.core.runtime.system.transaction.IsisTransaction.flush(IsisTransaction.java:314)
>      at org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel$ResultType$1.addResultsAccordingToSingleResultsMode(ActionPanel.java:194)
>      at org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel$ResultType$1.addResults(ActionPanel.java:164)
>      at org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel.executeActionAndProcessResults(ActionPanel.java:133)
>      at org.apache.isis.viewer.wicket.ui.actions.params.ActionParametersFormPanel$ActionParameterForm$1.onSubmit(ActionParametersFormPanel.java:121)
>      at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1235)
>      at org.apache.wicket.markup.html.form.Form.process(Form.java:921)
>      at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:767)
>      at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:700)
>      at java.lang.reflect.Method.invoke(Unknown Source)
>      at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258)
>      at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:216)
>      at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:240)
>      at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:226)
>      at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:830)
>      at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
>      at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:253)
>      at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:210)
>      at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:281)
>      at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:188)
>      at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:245)
>      at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
>      at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
>      at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
>      at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
>      at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
>      at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
>      at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
>      at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
>      at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
>      at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
>      at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
>      at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira