Hi Dan, I tried this and its not correct, I get the open and close methods being called over and over whenever I open and close an object in the UI. but the jdo listener method preStore (InstanceLifecycleEvent event) never gets called.
I pictured open() and close() being called just once as the DOMAIN service singleton is created by Isis and then it listens on the JDO events as each entity goes through its lifecycle. I will put this aside as its not the main priority. I'll read up and understand the jdo events to find an answer, this must be close to correct. On Wed, Sep 16, 2015 at 4:02 PM, Dan Haywood <d...@haywood-associates.co.uk> wrote: > Hi Steve, > > Although there isn't any direct support for this, it's should be relatively > easy to do by using the underlying JDO API. > > As a quick code sketch: > > public interface CreateTrackingEntity { > void setCreatedBy(String createdBy); > void setCreatedOn(DateTime createdOn); > } > > public interface ModifyTrackingEntity { > void setModifiedBy(String username); > void setModifiedOn(DateTime modifiedOn); > } > > > Your entity should implement one or both of the above. > > Then, define a service such as: > > @RequestScoped > @DomainService(nature=NatureOfService.DOMAIN) > public class UpdateableEntityServices implements > javax.jdo.listener.StoreLifecycleListener { > > @PostConstruct > public void open() { > > > isisJdoSupport.getJdoPersistenceManager().addInstanceLifecycleListener(this); > } > > @PreDestroy > public void close() { > > > isisJdoSupport.getJdoPersistenceManager().removeInstanceLifecycleListener(this); > } > > @Programmatic > public void preStore (InstanceLifecycleEvent event) { > > final Object pi = event.getPersistentInstance(); > > if(pi instanceof org.datanucleus.enhancement.Persistable) { > boolean isPersistent = > ((org.datanucleus.enhancement.Persistable)pi).dnIsPersistent(); > > if(!isPersistent) { > if(pi instanceof CreateTrackingEntity) { > > ((CreateTrackingEntity)pi).setCreatedBy(container.getUserName()); > > ((CreateTrackingEntity)pi).setCreatedOn(clockService.nowAsDateTime()); > } > } else { > if(pi instanceof ModifyTrackingEntity) { > > ((ModifyTrackingEntity)pi).setModifiedBy(container.getUserName()); > > ((ModifyTrackingEntity)pi).setModifedOn(clockService.nowAsDateTime()); > } > } > } > } > > @Programmatic > public void postStore (InstanceLifecycleEvent event) { > // no-op > } > > @Inject > private DomainObjectContainer container; > > @Inject > private ClockService clockService; > > @Inject > private IsisJdoSupport isisJdoSupport; > } > > > > ~~~~~~~~~~~~ > There is actually a ticket in JIRA for this [1], so I'll formalize this as > a service in Isis 1.10.0. > > HTH > Dan > > [1] https://issues.apache.org/jira/browse/ISIS-867 > > > On 16 September 2015 at 05:18, Stephen Cameron <steve.cameron...@gmail.com > > > wrote: > > > Hi, > > > > Could someone please assist me in adding this capability, to automate the > > creation and update of values in these standard fields > > > > created_by > > created_on > > modified_by > > modified_on > > > > That is I need to set the first two on creating a new object, and the > last > > two on modifying an object. > > > > Thanks > > Steve Cameron > > >