Here's a sample of invalidating the removal of a Party in case it plays role in an agreement: https://github.com/estatio/estatio/blob/master/estatioapp/dom/src/main/java/org/estatio/dom/agreement/AgreementRoles.java#L143
HTH On 12 January 2015 at 19:38, Dan Haywood <[email protected]> wrote: > Hi Oscar, > > I think we can support this use case, but admittedly it isn't - yet - well > documented. > > First thing to say is that the "removing" lifecycle code hook method that > you quote isn't actually part of your stacktrace. As it happens, that's > probably a good thing... support for them is a little bit patchy (there > might be bugs). > > So, when I look at your stack trace, what's actually happening is that: > * BusinessEntity.deleteFromAssignedToBusinessProcesses(...) is performing a > "removeElement" on a wrapped collection, which fires an event via: > * CollectionRemoveFromFacetForInteractionAbstract, which is handled by > * RelationshipsBCMInformationEventHandler.on > > So, what you should do in the handler is to look at the event's "phase". > In fact, you really must pay attention to the phase because it is called > multiple times: > > switch(ev,getPhase()) { > case HIDE: > ... > case DISABLE: > ... > case VALIDATE: > ... > case EXECUTING: > ... > case EXECUTED: > ... > } > > As you have probably guessed, your code wants to go into the "EXECUTING" > bit, which is the pre-execute callback. I imagine at the moment it is > firing for all the cases, including the EXECUTED bit, and that's most > likely why JDO then complains at you when you try to access that deleted > object. > > Hope that makes sense / works... if not, then we can go round the loop. > > Cheers > Dan > > > > > > > > Two things about > Rather than do this on the removing() callback, I suggest you emit an event > on the action that The event that > > On 12 January 2015 at 18:24, GESCONSULTOR - Óscar Bou < > [email protected]> wrote: > > > Hi all. > > > > I want to get notified when a domain object is going to be removed. > > > > I have defined it as this: > > > > public class Relationship { > > > > … > > > > public void removing() { > > this.eventBusService.post(new RelationshipRemovingEvent(this)); > > } > > ... > > > > } > > > > And an Event Handler like this: > > > > public class RelationshipsBCMInformationEventHandler extends > > AbstractXMSService { > > > > // {{ RELATIONSHIPS EVENTS HANDLER > > > > @Subscribe > > @Programmatic > > public void on(final RelationshipRemovingEvent event) { > > try { > > final RelationshipBCMInformation relationshipBCMInformation = > > > this.wrap(this.relationshipsBCMInformation).businessContinuityInformation(event.getRelationship()); > > this.getContainer().remove(relationshipBCMInformation); > > this.getContainer().flush(); > > } catch (final Exception e) { > > e.printStackTrace(); > > throw new ApplicationException(e); > > } > > } > > > > // }} > > > > // {{ injected: RelationshipsBCMInformation > > @Inject > > private RelationshipsBCMInformation relationshipsBCMInformation; > > > > // }} > > > > // {{ injected: EventBusService > > @Programmatic > > @PostConstruct > > public void postConstruct() { > > this.eventBusService.register(this); > > } > > > > @Programmatic > > @PreDestroy > > public void preDestroy() { > > this.eventBusService.unregister(this); > > } > > > > @javax.inject.Inject > > private EventBusService eventBusService; > > // }} > > > > } > > > > > > > > Problem is that when the code enters the “on” event handler, the > reference > > to the relationship accessed on "event.getRelationship()” is already > marked > > as deleted: > > > > > > javax.jdo.JDOUserException: No es posible leer campos de un objeto > borrado > > > FailedObject:0[OID]com.xms.framework.architecture.domain.model.Relationship > > at > > > org.datanucleus.api.jdo.state.PersistentNewDeleted.transitionReadField(PersistentNewDeleted.java:106) > > at > > > org.datanucleus.state.AbstractStateManager.transitionReadField(AbstractStateManager.java:650) > > at > > org.datanucleus.state.JDOStateManager.isLoaded(JDOStateManager.java:3194) > > at > > > com.xms.framework.api.domain.model.isis.AbstractXMSDomainObject.getId(AbstractXMSDomainObject.java) > > at > > > com.xms.framework.api.domain.model.isis.AbstractXMSDomainObject.hashCode(AbstractXMSDomainObject.java:431) > > at java.util.Objects.hashCode(Objects.java:96) > > at java.util.HashMap$Entry.hashCode(HashMap.java:847) > > at java.util.AbstractMap.hashCode(AbstractMap.java:494) > > at > > > org.datanucleus.query.QueryUtils.getKeyForQueryResultsCache(QueryUtils.java:1306) > > at > > > org.datanucleus.store.query.QueryManager.getDatastoreQueryResult(QueryManager.java:470) > > at > > > org.datanucleus.store.rdbms.query.JDOQLQuery.performExecute(JDOQLQuery.java:605) > > at > org.datanucleus.store.query.Query.executeQuery(Query.java:1786) > > at > > org.datanucleus.store.query.Query.executeWithMap(Query.java:1690) > > at > > org.datanucleus.api.jdo.JDOQuery.executeWithMap(JDOQuery.java:334) > > at > > > com.xms.framework.api.domain.model.isis.AbstractXMSDomainObjectRepositoryAndFactory.doFindByPropMultiTenant(AbstractXMSDomainObjectRepositoryAndFactory.java:759) > > at > > > com.xms.framework.api.domain.model.isis.AbstractXMSDomainObjectRepositoryAndFactory.findByPropMultiTenant(AbstractXMSDomainObjectRepositoryAndFactory.java:776) > > at > > > com.xms.framework.api.domain.model.isis.AbstractXMSDomainObjectRepositoryAndFactory.findByProp(AbstractXMSDomainObjectRepositoryAndFactory.java:769) > > at > > > com.xms.framework.api.domain.model.isis.AbstractSingletonMultiTenantObjectRepositoryAndFactory.singletonInstance(AbstractSingletonMultiTenantObjectRepositoryAndFactory.java:16) > > at > > > com.xms.framework.risk.domain.model.continuity.RelationshipsBCMInformation.businessContinuityInformation(RelationshipsBCMInformation.java:47) > > 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:606) > > at > > > org.apache.isis.core.metamodel.facets.actions.interaction.ActionInvocationFacetForInteractionAbstract.internalInvoke(ActionInvocationFacetForInteractionAbstract.java:314) > > at > > > org.apache.isis.core.metamodel.facets.actions.interaction.ActionInvocationFacetForInteractionAbstract.invoke(ActionInvocationFacetForInteractionAbstract.java:188) > > at > > > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:57) > > at > > > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:1) > > at > > > org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:205) > > at > > > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction.invoke(ActionInvocationFacetWrapTransaction.java:54) > > at > > > org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionImpl.execute(ObjectActionImpl.java:367) > > at > > > org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.handleActionMethod(DomainObjectInvocationHandler.java:563) > > at > > > org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.invoke(DomainObjectInvocationHandler.java:229) > > at > > > org.apache.isis.core.wrapper.proxy.ProxyInstantiatorForJavassist$1.invoke(ProxyInstantiatorForJavassist.java:52) > > at > > > com.xms.framework.risk.domain.model.continuity.RelationshipsBCMInformation_$$_jvstb07_2b.businessContinuityInformation(RelationshipsBCMInformation_$$_jvstb07_2b.java) > > at > > > com.xms.framework.risk.domain.model.continuity.RelationshipsBCMInformationEventHandler.on(RelationshipsBCMInformationEventHandler.java:23) > > 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:606) > > at > > > com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) > > at > > > com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) > > at > com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) > > at > > > com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) > > at com.google.common.eventbus.EventBus.post(EventBus.java:275) > > at > > > org.apache.isis.applib.services.eventbus.EventBusService.post(EventBusService.java:202) > > at > > > org.apache.isis.core.metamodel.facets.InteractionHelper.postEventForCollection(InteractionHelper.java:202) > > at > > > org.apache.isis.core.metamodel.facets.collections.interaction.CollectionRemoveFromFacetForInteractionAbstract.remove(CollectionRemoveFromFacetForInteractionAbstract.java:103) > > at > > > org.apache.isis.core.runtime.transaction.facets.CollectionRemoveFromFacetWrapTransaction$1.execute(CollectionRemoveFromFacetWrapTransaction.java:55) > > at > > > org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:160) > > at > > > org.apache.isis.core.runtime.transaction.facets.CollectionRemoveFromFacetWrapTransaction.remove(CollectionRemoveFromFacetWrapTransaction.java:52) > > at > > > org.apache.isis.core.metamodel.specloader.specimpl.OneToManyAssociationImpl.removeElement(OneToManyAssociationImpl.java:190) > > at > > > org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.handleCollectionRemoveFromMethod(DomainObjectInvocationHandler.java:526) > > at > > > org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.invoke(DomainObjectInvocationHandler.java:218) > > at > > > org.apache.isis.core.wrapper.proxy.ProxyInstantiatorForJavassist$1.invoke(ProxyInstantiatorForJavassist.java:52) > > at > > > com.xms.framework.architecture.domain.model.business.extensions.businessactor.Person_$$_jvstb07_28.removeFromAssignedToBusinessProcesses(Person_$$_jvstb07_28.java) > > at > > > com.xms.framework.architecture.domain.model.business.BusinessEntity.deleteFromAssignedToBusinessProcesses(BusinessEntity.java:93) > > 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:606) > > at > > > org.apache.isis.core.metamodel.facets.actions.interaction.ActionInvocationFacetForInteractionAbstract.internalInvoke(ActionInvocationFacetForInteractionAbstract.java:314) > > at > > > org.apache.isis.core.metamodel.facets.actions.interaction.ActionInvocationFacetForInteractionAbstract.invoke(ActionInvocationFacetForInteractionAbstract.java:188) > > at > > > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:57) > > at > > > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:1) > > at > > > org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:205) > > at > > > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction.invoke(ActionInvocationFacetWrapTransaction.java:54) > > at > > > org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionImpl.execute(ObjectActionImpl.java:367) > > at > > > org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.handleActionMethod(DomainObjectInvocationHandler.java:563) > > at > > > org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.invoke(DomainObjectInvocationHandler.java:229) > > at > > > org.apache.isis.core.wrapper.proxy.ProxyInstantiatorForJavassist$1.invoke(ProxyInstantiatorForJavassist.java:52) > > at > > > com.xms.framework.architecture.domain.model.business.extensions.businessactor.Person_$$_jvstb07_28.deleteFromAssignedToBusinessProcesses(Person_$$_jvstb07_28.java) > > at > > > com.xms.framework.architecture.domain.model.business.BusinessProcess.deleteFromRequiredBusinessEntities(BusinessProcess.java:476) > > 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:606) > > at > > > org.apache.isis.core.metamodel.facets.actions.interaction.ActionInvocationFacetForInteractionAbstract.internalInvoke(ActionInvocationFacetForInteractionAbstract.java:314) > > at > > > org.apache.isis.core.metamodel.facets.actions.interaction.ActionInvocationFacetForInteractionAbstract.invoke(ActionInvocationFacetForInteractionAbstract.java:188) > > at > > > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:57) > > at > > > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:1) > > at > > > org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:205) > > at > > > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction.invoke(ActionInvocationFacetWrapTransaction.java:54) > > at > > > org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionImpl.execute(ObjectActionImpl.java:367) > > at > > > org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.handleActionMethod(DomainObjectInvocationHandler.java:563) > > at > > > org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.invoke(DomainObjectInvocationHandler.java:229) > > at > > > org.apache.isis.core.wrapper.proxy.ProxyInstantiatorForJavassist$1.invoke(ProxyInstantiatorForJavassist.java:52) > > at > > > com.xms.framework.architecture.domain.model.business.BusinessProcess_$$_jvstb07_27.deleteFromRequiredBusinessEntities(BusinessProcess_$$_jvstb07_27.java) > > at > > > com.xms.framework.risk.integration.tests.continuity.RelationshipsBCMInformationTests.testDeleteColletionWithRelationshipAlsoDeletesRelationshipBCMInformation(RelationshipsBCMInformationTests.java:72) > > 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:606) > > at > > > org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) > > at > > > org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) > > at > > > org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) > > at > > > org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) > > at > > > org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) > > at > > > org.apache.isis.core.integtestsupport.IntegrationTestAbstract$IsisTransactionRule$1.evaluate(IntegrationTestAbstract.java:199) > > at > > > org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2$1.evaluate(JUnitRuleMockery2.java:146) > > at > > > org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:168) > > at org.junit.rules.RunRules.evaluate(RunRules.java:20) > > at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) > > at > > > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) > > at > > > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) > > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) > > at > org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) > > at > > org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) > > at > org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) > > at > org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) > > at > > > org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) > > at org.junit.runners.ParentRunner.run(ParentRunner.java:309) > > at > > > org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) > > at > > > org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) > > at > > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) > > at > > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) > > at > > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) > > at > > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) > > > > > > So, as it could be a quite “common” events-related use case (referencing > > the same entity “before” deleting it), could the event be dispatched > BEFORE > > sending the object to DN to mark it as deleted? > > > > Or, is there any other way to detect when an object is going to be > deleted > > (previously to being deleted, obviously) ? > > > > > > Thanks in advance, > > > > Oscar > > > > > > > > >
