I have tried to answer that under http://stackoverflow.com/a/24839202/1082681 if anyone is interested.
Bottom line: set() pointcuts are not enough here, you need to do manual bookkeeping for which collections/maps are assigned to which object members of interest. I think my solution is rather ugly, but it was fun to develop. Hopefully someone else can come up with something better. -- Alexander Kriegisch http://scrum-master.de Eric B schrieb am 16.07.2014 18:51: > I've posted this question on StackOverflow > (http://stackoverflow.com/q/24786391/827480 > <http://stackoverflow.com/q/24786391/827480> ), but am sending it here as > well as not everyone monitors StackOverflow. > > > have the need to log any changes to fields in an entity - whether it is a > String change, or addition/deletion to a collection/map. > > Given a JPA entity with a bunch of primitive fields, it is fairly trivial to > write an pointcut that will intercept any set(..) methods on the fields. > > However, where I am stuck is how to write the pointcut to handle > Collections/Sets/Embedded/etc. > > Given the following entity: > > > @Entity > public class Provider implements Serializable { > > @Id > @GeneratedValue(strategy = GenerationType.AUTO) > @Column(name = "id") > private Long id; > > > private String name; > > @Column(name="type", nullable=false) > @Enumerated(EnumType.STRING) > private ProviderType providerType; > > > @ManyToMany > private List<Contact> contacts; > > @Embedded > private Validity validity; > > // setters and getters omitted for brevity > > } > > > where Contact is a simple entity with a bunch of primitive fields and > Validity is a non-entity object with some primitive fields. > > The following pointcut will intercept all set() methods in the class: > > > pointcut fieldSetter() : set(!static !final !transient * *.Provider) && > args(val) && target(o); > > > to which I can write a before/after/around advice. > > > before( Object val, Object o) : fieldSetter{ > String fieldName = thisJoinPointStaticPart.getSignature().getName(); > System.out.println( "Object being changed: " + o.toString() ); > System.out.println( "New Value for: " + fieldname + " is: " + v.toString() > ); > } > > > But how do I handle that case for an Embedded object or a Collection? For an > Embedded object, if I just put my advice around the setter method in the > object, how do I know which is the parent object that is actually being > modified/persisted? > > And in the case of collections/sets/maps/etc, how do I advise against the > add/remove methods? What I need to end up doing is advising the > getCollection().add() methods as well as the getCollection.remove() methods. > But I can't seem to figure out a good way. > > > Thanks, > > Eric > > _______________________________________________ aspectj-users mailing list aspectj-users@eclipse.org To change your delivery options, retrieve your password, or unsubscribe from this list, visit https://dev.eclipse.org/mailman/listinfo/aspectj-users