cayenne-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Hugi Thordarson <h...@karlmenn.is>
Subject Re: Change audit framework
Date Wed, 23 Sep 2015 08:28:24 GMT
Ah, of courseā€¦ How do you handle a change to a to-many relationship in that scheme, do oldValue
and newValue contain the entire object lists pre- and post-modification?

- hugi



> On 23. sep. 2015, at 08:09, Andrus Adamchik <andrus@objectstyle.org> wrote:
> 
> Just a pair of values:
> 
> public class A2PropertyChange {
> 
> 	private Object oldValue;
> 	private Object newValue;
> 
> 	...
> }
> 
> and as I've shown earlier, my system would emit a stream of JSON messages like this:
> 
> {"ts":1427090346831,"by":"someuser","clientIP":"10.1.1.1","serverIP":"127.0.0.1","op":"UPDATE","id":"MyEntity:954619","changes":{"email":["root@example.com","root@example.org"]}}
> {"ts":1441285381823,"by":"someotheruser","clientIP":"10.1.1.2","serverIP":"127.0.0.1","op":"DELETE","id":"MyOtherEntity:3279984:17","snapshot":{"favorite":true,"sequence":0}}
> 
> We'd send them to Apache Kafka, so that other internal apps can process them sequentially
at their leisure.
> 
> Andrus
> 
>> On Sep 23, 2015, at 10:55 AM, Hugi Thordarson <hugi@karlmenn.is> wrote:
>> 
>> This looks really great! Would you mind sharing how the class A2PropertyChange looks?

>> 
>> Cheers,
>> - hugi
>> 
>> 
>> 
>>> On 22. sep. 2015, at 19:57, Andrus Adamchik <andrus@objectstyle.org> wrote:
>>> 
>>> Here is the design of the audit framework for everyone's review:
>>> 
>>> https://issues.apache.org/jira/browse/CAY-2030
>>> 
>>> The way it will work from the user perspective is this:
>>> 
>>> // bootstrap the filter by adding an extra Cayenne-provided module to 
>>> // runtime. Optionally add your own module that overrides context provider 
>>> // (e.g. to store request IP address and user name).
>>> ServerRuntime r = ServerRuntimeBuilder.builder().addModule(new WhateverModuleNameWeUse()).build();
>>> 
>>> // register listener
>>> r.getDataDomain().addListener(new MyListener());
>>> 
>>> 
>>> // listener code
>>> class MyListener {
>>> 
>>> 
>>>  @PostCommit
>>>  void processAsChangeset(Map<ObjectId, ObjectChangeSet> map) {..}
>>> 
>>>  // optionally can take a changeset serialized to JSON
>>>  @PostCommit
>>>  void processAsJSON(Map<ObjectId, String> map) {..}
>>> }
>>> 
>>> Andrus
>> 
> 


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