[ 
https://issues.apache.org/jira/browse/WOOKIE-168?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12966185#action_12966185
 ] 

Paul Sharples edited comment on WOOKIE-168 at 12/3/10 5:00 AM:
---------------------------------------------------------------

Agreed, I don't think removing the constraints is the right way forward as 
there is still an underlying issue.  

I've been experimenting with the code today, specifically the bean entites 
where the cascading behaviour is defined, but I've not been able to get to the 
bottom of it.  I will have to read the manuals in more detail to figure out 
what is going on properly (i'm not as up on it as i was with hibernate).  
However, using an approach similar to Scotts, I have been able to resolve the 
errors by adding code in the ...

WidgetFactory.destroy(instance)

...method to remove any child records first (we used to do it this way in a 
similar fashion)

a la....

public static boolean destroy(IWidget widget){
                if(widget==null) return false;
                
                // remove any defaults for this widget
                IPersistenceManager persistenceManager = 
PersistenceManagerFactory.getPersistenceManager();
                IWidgetDefault[] widgetDefault = 
persistenceManager.findByValue(IWidgetDefault.class, "widget", widget);
                if (widgetDefault.length == 1) 
persistenceManager.delete(widgetDefault[0]);
                
                // remove any widget instances for this widget
                IWidgetInstance[] instances = 
persistenceManager.findByValue(IWidgetInstance.class, "widget", widget);  
                for(IWidgetInstance instance : instances){              
                        IParticipant[] participants = 
persistenceManager.findParticipants(instance);
                        for (IParticipant participant:participants){
                                persistenceManager.delete(participant);
                        }
                        
                        // remove any preferences
                        IPreference[] preferences = 
persistenceManager.findByValue(IPreference.class, "widgetInstance", instance);
                        persistenceManager.delete(preferences);
                        
                        // remove the instance
                        WidgetInstanceFactory.destroy(instance);
                }

        // remove any AccessRequests
        IAccessRequest[] accessRequests = 
persistenceManager.findByValue(IAccessRequest.class, "widget", widget);
        persistenceManager.delete(accessRequests);

        //remove SharedDataEntries
        ISharedData[] sharedData = 
persistenceManager.findByValue(ISharedData.class, "widget", widget);
        persistenceManager.delete(sharedData);
        
                // remove the widget itself
                persistenceManager.delete(widget);
                return true;
        } 


This stops the error messages we noticed when trying to delete a widget with 
attached preferences and/or shareddata.  Short term i think i should probably 
commit this and we flag an issue for a later release explaining the problem. 
(i.e. cascade deletion not configured correctly)

  
> Cannot remove widget from wookie after it has become an instance.
> -----------------------------------------------------------------
>
>                 Key: WOOKIE-168
>                 URL: https://issues.apache.org/jira/browse/WOOKIE-168
>             Project: Wookie
>          Issue Type: Bug
>          Components: Server
>    Affects Versions: 0.9.0
>         Environment: Win Vista (all browsers)
>            Reporter: Paul Sharples
>            Priority: Critical
>             Fix For: 0.9.0
>
>
> This problem occurs when you import a widget into wookie and you also 
> instantiate it - For example choosing it from the gallery. If you then try to 
> remove it from wookie, a stacktrace appears in the log.
> To reproduce...
> (1) Start wookie in standalone mode
> (2) Go to http://localhost:8080/wookie
> (3) Drag 'n drop a .wgt package into the hot deploy folder of wookie
> (4) Login to the admin section of wookie & verifiy that it is installed 
> correctly.
> (5) Using the 'delete widget' section of the wookie admin, remove the widget 
> (this should work okay)
> (6) Repeat steps 3 & 4. only
> (7) Go to the gallery page and click on the newly imported widget, so that it 
> becomes an instance.
> (8) Return to the admin section of wookie & try to delete the widget (step 5)
> The second time an error occurs with the following stacktrace...
>    [java] 14:45:41,320 ERROR log:? - /wookie/admin/WidgetAdminServlet
>      [java] java.lang.RuntimeException: Persistence commit exception caught 
> for transaction: org.apache.wookie.beans.util.PersistenceCommitException: 
> Transaction commit exception: <openjpa-2.0.0-r422266:935683 fatal store 
> error> org.apache.openjpa.persistence.RollbackException: The transaction has 
> been rolled back.  See the nested exceptions for details on the errors that 
> occurred.
>      [java] FailedObject: org.apache.wookie.beans.jpa.impl.WidgetImpl-22
>      [java]   at 
> org.apache.wookie.server.MainFilter.doFilter(MainFilter.java:80)
>      [java]   at 
> org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089)
>      [java]   at 
> org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:365)
>      [java]   at 
> org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
>      [java]   at 
> org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
>      [java]   at 
> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
>      [java]   at 
> org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
>      [java]   at 
> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
>      [java]   at org.mortbay.jetty.Server.handle(Server.java:285)
>      [java]   at 
> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:502)
>      [java]   at 
> org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:821)
>      [java]   at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:513)
>      [java]   at 
> org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:208)
>      [java]   at 
> org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:378)
>      [java]   at 
> org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:226)
>      [java]   at 
> org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
>      [java] Caused by: 
> org.apache.wookie.beans.util.PersistenceCommitException: Transaction commit 
> exception: <openjpa-2.0.0-r422266:935683 fatal store error> 
> org.apache.openjpa.persistence.RollbackException: The transaction has been 
> rolled back.  See the nested exceptions for details on the errors that 
> occurred.
>      [java] FailedObject: org.apache.wookie.beans.jpa.impl.WidgetImpl-22
>      [java]   at 
> org.apache.wookie.beans.jpa.JPAPersistenceManager.commit(JPAPersistenceManager.java:370)
>      [java]   at 
> org.apache.wookie.server.MainFilter.doFilter(MainFilter.java:64)
>      [java]   ... 15 more
>      [java] Caused by: <openjpa-2.0.0-r422266:935683 fatal store error> 
> org.apache.openjpa.persistence.RollbackException: The transaction has been 
> rolled back.  See the nested exceptions for details on the errors that 
> occurred.
>      [java] FailedObject: org.apache.wookie.beans.jpa.impl.WidgetImpl-22
>      [java]   at 
> org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:583)
>      [java]   at 
> org.apache.wookie.beans.jpa.JPAPersistenceManager.commit(JPAPersistenceManager.java:366)
>      [java]   ... 16 more
>      [java] Caused by: <openjpa-2.0.0-r422266:935683 fatal general error> 
> org.apache.openjpa.persistence.PersistenceException: The transaction has been 
> rolled back.  See the nested exceptions for details on the errors that 
> occurred.
>      [java] FailedObject: org.apache.wookie.beans.jpa.impl.WidgetImpl-22
>      [java]   at 
> org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2302)
>      [java]   at 
> org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2139)
>      [java]   at 
> org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2037)
>      [java]   at 
> org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1955)
>      [java]   at 
> org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
>      [java]   at 
> org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1479)
>      [java]   at 
> org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:925)
>      [java]   at 
> org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:559)
>      [java]   ... 17 more
>      [java] Caused by: <openjpa-2.0.0-r422266:935683 fatal general error> 
> org.apache.openjpa.persistence.PersistenceException: DELETE on table 'WIDGET' 
> caused a violation of foreign key constraint 'FKPARTICIPANT1' for key (22).  
> The statement has been rolled back. {prepstmnt 32437201 DELETE FROM 
> JAVA.WIDGET WHERE ID = ? AND JPA_VERSION = ? [params=(int) 22, (int) 1]} 
> [code=20000, state=23503]
>      [java] FailedObject: org.apache.wookie.beans.jpa.impl.WidgetImpl-22
>      [java]   at 
> org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4821)
>      [java]   at 
> org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4787)
>      [java]   at 
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
>      [java]   at 
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:78)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:143)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushAndUpdate(BatchingPreparedStatementManagerImpl.java:81)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:99)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:87)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:357)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flushGraph(ConstraintUpdateManager.java:349)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:111)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:59)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:103)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:76)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:751)
>      [java]   at 
> org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131)
>      [java]   at 
> org.apache.openjpa.datacache.DataCacheStoreManager.flush(DataCacheStoreManager.java:540)
>      [java]   at 
> org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131)
>      [java]   ... 24 more
>      [java] Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: 
> DELETE on table 'WIDGET' caused a violation of foreign key constraint 
> 'FKPARTICIPANT1' for key (22).  The statement has been rolled back. 
> {prepstmnt 32437201 DELETE FROM JAVA.WIDGET WHERE ID = ? AND JPA_VERSION = ? 
> [params=(int) 22, (int) 1]} [code=20000, state=23503]
>      [java]   at 
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:257)
>      [java]   at 
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:233)
>      [java]   at 
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$1000(LoggingConnectionDecorator.java:70)
>      [java]   at 
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:1079)
>      [java]   at 
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:285)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1722)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.executeUpdate(PreparedStatementManagerImpl.java:267)
>      [java]   at 
> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:118)
>      [java]   ... 37 more

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to