openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Leonardo K. Shikida" <shik...@gmail.com>
Subject Re: Any way to access original field values by name from Auditor context
Date Mon, 10 Feb 2014 17:29:09 GMT
nice to hear that ;-)



[]

Leo


On Mon, Feb 10, 2014 at 2:45 PM, James Talbut <jtalbut@spudsoft.co.uk>wrote:

> One quick upgrade to 2.3.0 and my tests are passing.
>
> Thank you, that's a lot neater than I feared it would be.
>
> Jim
>
>
> On Mon, Feb 10, 2014 at 02:36:00PM -0200, Leonardo K. Shikida wrote:
> > [leoks@oc7612866413 ~]$ ls Downloads/apache-tomee-plus-1.6.0/lib/*jpa*
> > Downloads/apache-tomee-plus-1.6.0/lib/openejb-jpa-integration-4.6.0.jar
> > Downloads/apache-tomee-plus-1.6.0/lib/openjpa-2.3.0-nonfinal-1540826.jar
> >
> >
> > seems to be 2.3.0
> >
> > []
> >
> > Leo
> >
> >
> > On Mon, Feb 10, 2014 at 2:34 PM, Leonardo K. Shikida <shikida@gmail.com
> >wrote:
> >
> > > it should be enabled since 2.2.0
> > >
> > >
> > >
> http://openjpa.apache.org/builds/2.2.0/apache-openjpa/docs/ref_guide_audit.html
> > >
> > > []
> > >
> > > Leo
> > >
> > > []
> > >
> > > Leo
> > >
> > >
> > > On Mon, Feb 10, 2014 at 2:28 PM, James Talbut <jtalbut@spudsoft.co.uk
> >wrote:
> > >
> > >> Hi Leo,
> > >>
> > >> That looks great, but my version of OpenJPA (2.2.2) doesn't seem to
> have
> > >> two key functions:
> > >> audited.getManangedFieldValue(field)
> > >> audited.getOriginalFieldValue(field)
> > >>
> > >> What version are you using?
> > >>
> > >> Thanks
> > >>
> > >> Jim
> > >>
> > >>
> > >> On Mon, Feb 10, 2014 at 02:06:18PM -0200, Leonardo K. Shikida wrote:
> > >> > I am not sure if this is what want, but I do something like this
> with my
> > >> > classes
> > >> >
> > >> > my audited entity
> > >> >
> > >> > @Auditable(values = { AuditableOperation.CREATE,
> > >> AuditableOperation.UPDATE
> > >> > })
> > >> > public class MyClass implements Serializable {
> > >> > (...)
> > >> > }
> > >> >
> > >> > my persistence.xml
> > >> >
> > >> > <property name="openjpa.Auditor"
> > >> >
> > >>
> value="my.DatabaseAuditor(sequence='false',synchDriver='oracle.jdbc.OracleDriver',synchDriverUser='myuser',synchDriverPassword='mypass',synchDriverJdbc='jdbc:oracle:thin:@localhost
> > >> > :1521:XE')"/>
> > >> >
> > >> > my Auditor
> > >> >
> > >> > public class DatabaseAuditor implements Auditor {
> > >> >
> > >> >     private AuditLogger    defaultAuditor    = new AuditLogger();
> > >> >     private String        synchDriver;
> > >> >     private String        synchDriverUser;
> > >> >     private String        synchDriverPassword;
> > >> >     private String        synchDriverJdbc;
> > >> >     private String        sequence;
> > >> >
> > >> >     @Override
> > >> >     public void audit(Broker broker, Collection<Audited> newObjects,
> > >> > Collection<Audited> updates, Collection<Audited> deletes)
{
> > >> > (...)
> > >> >         if (updates.size() > 0) {
> > >> >             for (Audited a : updates) {
> > >> >                     this.addChangeLogForUpdate(a);
> > >> >             }
> > >> >         }
> > >> >     }
> > >> >
> > >> > and addChangeLogForUpdate can access both previous and new values
> just
> > >> > using
> > >> >
> > >> >         for (String field : audited.getUpdatedFields()) {
> > >> >             if
> (Arrays.asList(DatabaseAuditor.FIELDS).contains(field)) {
> > >> >                 newdata.put(field,
> > >> audited.getManangedFieldValue(field));
> > >> >                 olddata.put(field,
> > >> audited.getOriginalFieldValue(field));
> > >> >                 //use driver info to save this using plain JDBC
> > >> >
> > >> > I hope it helps
> > >> >
> > >> > Leo
> > >> >
> > >> >
> > >> >
> > >> > []
> > >> >
> > >> > Leo
> > >> >
> > >> >
> > >> > On Mon, Feb 10, 2014 at 1:36 PM, Boblitz John <
> > >> john.boblitz@bertschi.com>wrote:
> > >> >
> > >> > > I was working on something similar and this might get you closer
> > >> > >
> > >> > >         StateManagerImpl sm =
> > >> > > (StateManagerImpl)currentState.pcGetStateManager();
> > >> > >         SaveFieldManager sfm = sm.getSaveFieldManager();
> > >> > >         PersistenceCapable oldState = sfm.getState();
> > >> > >
> > >> > > I believe you must also specifiy openjpa.RestoreState so that
> this can
> > >> > > work ...
> > >> > >
> > >> > > Hope this helps ...
> > >> > >
> > >> > > John
> > >> > >
> > >> > > > -----Original Message-----
> > >> > > > From: James Talbut [mailto:jtalbut@spudsoft.co.uk]
> > >> > > > Sent: Monday, February 10, 2014 3:10 PM
> > >> > > > To: users@openjpa.apache.org
> > >> > > > Subject: Any way to access original field values by name
from
> > >> Auditor
> > >> > > context
> > >> > > >
> > >> > > > Hi,
> > >> > > >
> > >> > > > I'm trying to record old and new field values in an Auditor.
> > >> > > > Using something like this I can get the new value (using
the
> > >> > > > audited.getUpdatedFields() to provide the values for 'field'):
> > >> > > >
> > >> > > >     private Object getFieldValue(Broker broker, Object object,
> > >> String
> > >> > > field) {
> > >> > > >         if (object == null) {
> > >> > > >             return null;
> > >> > > >         }
> > >> > > >         PersistenceCapable persistenceCapable =
> > >> > > > ImplHelper.toPersistenceCapable(object,
> > >> > > > JPAFacadeHelper.toEntityManager(broker));
> > >> > > >         OpenJPAStateManager stateManager =
> > >> > > > (OpenJPAStateManager)persistenceCapable.pcGetStateManager();
> > >> > > >         if (stateManager == null) {
> > >> > > >             return null;
> > >> > > >         }
> > >> > > >         int fieldIdx =
> > >> > > stateManager.getMetaData().getField(field).getIndex();
> > >> > > >         Object value = stateManager.fetch(fieldIdx);
> > >> > > >         if ((value instanceof RowSetHolder) &&
> > >> > > >                 (((RowSetHolder)value).getSize() == 0))
{
> > >> > > >             return null;
> > >> > > >         }
> > >> > > >         return value;
> > >> > > >     }
> > >> > > >
> > >> > > > But the old value has no state manager, so pcGetStateManager
> always
> > >> > > returns
> > >> > > > null.
> > >> > > >
> > >> > > > The old object does have the correct values set on it, but
I
> don't
> > >> have
> > >> > > to have to
> > >> > > > use reflection (and somehow work out the mapping from field
> name to
> > >> > > method
> > >> > > > name).
> > >> > > >
> > >> > > > Is there any equivalent to the above that will work for
the old
> > >> values
> > >> > > (as
> > >> > > > returned by audited.getOriginalObject()) ?
> > >> > > >
> > >> > > > Thanks.
> > >> > > >
> > >> > > > Jim
> > >> > >
> > >>
> > >
> > >
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message