[ 
https://issues.apache.org/jira/browse/CAY-2030?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Andrus Adamchik updated CAY-2030:
---------------------------------
    Description: 
Per http://www.mail-archive.com/dev@cayenne.apache.org/msg07968.html trying to 
implement a proper transaction audit. After some thought, I think it should 
work as follows:

0. A new object design for change tracking: ChangeMap/ ObjectChange / 
ObjectPropertyChange

1. PostCommitFilter : A filter that captures all changes before and after the 
commit (including generated PKs returned from DB) and generates a ChangeMap. 
Will notify the listeners after the commit. 

2. A Module that registers the filter (once  CAY-2028 is done, the module 
should also take care of ordering the filter to go inside transaction).

3. Listener interface (TODO: eventually switch to annotations?)

{noformat}public interface PostCommitListener {

        void onPostCommit(ObjectContext originatingContext, ChangeMap changes);
}
{noformat}

4. PostCommitModuleBuilder  to add post commit extensions.

5. Listeners will be added via PostCommitModuleBuilder. TODO: combine with our 
normal  listeners and switch to annotations.

6. For per-entity filtering and further customization reuse @Auditable 
annotation . Add "confidential" property to @Auditable to allow to securely log 
changes for properties like passwords, etc.

(since most people would want to run this filter within a TX, an effective 
usage of this is dependent on CAY-2028; however the implementation is not)

  was:
Per http://www.mail-archive.com/dev@cayenne.apache.org/msg07968.html trying to 
implement a proper transaction audit. After some thought, I think it should 
work as follows:

0. ObjectChangeSet - an object that captures all changes for a single ObjectId 
(including the change of ID itself)

1. ChangeCaptureFilter : A filter that captures all changes before and after 
the commit (including generated PKs returned from DB) and stores them in a map 
of <ObjectId,ObjectChangeSet>. Will notify the listeners after the commit. 

2. A Module that registers the filter (once  CAY-2028 is done, the module 
should also take care of ordering the filter to go inside transaction).

3. Listener annotation: 

{noformat}
@PostCommit
{noformat}

4. Listeners will be registered same way as other Cayenne listeners, and will 
currently take the entire change set of the commit. Listener method format:

{noformat}
// the arguments that can be injected in the listener method
@PostCommit
void postCommit(ObjectContext originatingContext, Map<ObjectId, 
ObjectChangeSet>)
{noformat}

5. Context provider - a DI-supplied context provider that can give us client IP 
address, identity name, etc.

For now there is no per-entity filtering, and the whole batch of audit data is 
generated and passed to the listener. It can do its own filtering of course.

(since most people would want to run this filter within a TX, an effective 
usage of this is dependent on CAY-2028; however the implementation is not)


> @PostCommit and capturing a stream of commit changes
> ----------------------------------------------------
>
>                 Key: CAY-2030
>                 URL: https://issues.apache.org/jira/browse/CAY-2030
>             Project: Cayenne
>          Issue Type: Task
>            Reporter: Andrus Adamchik
>            Assignee: Andrus Adamchik
>
> Per http://www.mail-archive.com/dev@cayenne.apache.org/msg07968.html trying 
> to implement a proper transaction audit. After some thought, I think it 
> should work as follows:
> 0. A new object design for change tracking: ChangeMap/ ObjectChange / 
> ObjectPropertyChange
> 1. PostCommitFilter : A filter that captures all changes before and after the 
> commit (including generated PKs returned from DB) and generates a ChangeMap. 
> Will notify the listeners after the commit. 
> 2. A Module that registers the filter (once  CAY-2028 is done, the module 
> should also take care of ordering the filter to go inside transaction).
> 3. Listener interface (TODO: eventually switch to annotations?)
> {noformat}public interface PostCommitListener {
>       void onPostCommit(ObjectContext originatingContext, ChangeMap changes);
> }
> {noformat}
> 4. PostCommitModuleBuilder  to add post commit extensions.
> 5. Listeners will be added via PostCommitModuleBuilder. TODO: combine with 
> our normal  listeners and switch to annotations.
> 6. For per-entity filtering and further customization reuse @Auditable 
> annotation . Add "confidential" property to @Auditable to allow to securely 
> log changes for properties like passwords, etc.
> (since most people would want to run this filter within a TX, an effective 
> usage of this is dependent on CAY-2028; however the implementation is not)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to