[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] How to create "conditional ITDs"?

Very cool.  I didn't think to use hasmember.  Thanks!

On Tue, Aug 4, 2009 at 4:27 PM, Ramnivas Laddad<ramnivas@xxxxxxxxxxxxxxx> wrote:
> Take a look at -Xhasmember option to ajc. You should be able to do something
> along the following lines:
> interface NeedsPrePersist {
> }
> declare parents: !hasfield(@PrePersist * *) && (@Entity *) extends
> NeedPrePersist;
> Then introduce fields and methods to only types that implement
> NeedPrePersist.
> -Ramnivas
> On Tue, Aug 4, 2009 at 3:32 PM, Matthew Adams <matthew@xxxxxxxxxxxxxxx>
> wrote:
>>
>> Hi all,
>>
>> I was wondering how it might be possible to achieve what I'm calling a
>> conditional inter-type declaration.
>>
>> Here's a simple auditing example.  For a JPA entity, I want to
>> introduce a @PrePersist method if and only if the target class doesn't
>> have one because it's an error to have multiple @PrePersist methods on
>> an entity.  If it already has a @PrePersist method, I want to execute
>> advice after the target instance's @PrePersist method is invoked by
>> the JPA implementation.  Same for @PreUpdate.
>>
>> The example below will work for Person, but not for Document --
>> Document will end up with two @PrePersist methods.  How can I refactor
>> this to work for both?
>>
>> ========
>> @Entity
>> public class Document {
>>  // ...
>>  @PrePersist
>>  private void prePersist() { /* ... */ }
>> }
>> ========
>> @Entity
>> public class Person {
>>  // ...
>> }
>> ========
>> // works only for an @Entity that DOES NOT define a @PrePersist or a
>> @PreUpdate method
>> public aspect AuditingItd {
>>        private interface Auditable {
>>        }
>>
>>        declare parents:  (@javax.persistence.Entity *) implements
>> Auditable;
>>
>>        @Column(name = "updated")
>>        private Date Auditable.updated;
>>
>>        @PrePersist
>>        private void Auditable.auditablePrePersist() {
>>                updated = new Date();
>>        }
>>
>>        @PreUpdate
>>        private void Auditable.auditablePreUpdate() {
>>                updated = new Date();
>>        }
>> }
>> =========
>>
>> -matthew
>>
>> --
>> mailto:matthew@xxxxxxxxxxxxxxx
>> skype:matthewadams12
>> yahoo:matthewadams
>> aol:matthewadams12
>> google-talk:matthewadams12@xxxxxxxxx
>> msn:matthew@xxxxxxxxxxxxxxx
>> http://matthewadams.me
>> http://www.linkedin.com/in/matthewadams
>> _______________________________________________
>> aspectj-users mailing list
>> aspectj-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>



-- 
mailto:matthew@xxxxxxxxxxxxxxx
skype:matthewadams12
yahoo:matthewadams
aol:matthewadams12
google-talk:matthewadams12@xxxxxxxxx
msn:matthew@xxxxxxxxxxxxxxx
http://matthewadams.me
http://www.linkedin.com/in/matthewadams