[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] How to create "conditional ITDs"?
|
Nice stuff, Simone. It looks like Magma is somewhere between custom
AspectJ and Spring Roo. It would be interesting to see if a Magma
Spring Roo plugin makes sense.
-matthew
On Wed, Aug 5, 2009 at 2:53 AM, Simone Gianni<simoneg@xxxxxxxxxx> wrote:
> Hi Matthew,
> I've done that to introduce @Id and @Version if not provided on JPA classes.
> You need to use the -XhasMember compiler option, and then I wrote it this
> way :
>
> public aspect InstallIdByDefault {
>
> /**
> * Marker interface for beans receiving the default id.
> *
> * @author Simone Gianni <simoneg@xxxxxxxxxx>
> */
> public static interface WithDefaultId {
>
> }
>
> declare parents : ((@Entity *) && !(@NoId *) &&
> !hasmethod(@(Id||EmbeddedId) public * get*()) && !hasfield(@(Id||EmbeddedId)
> * *)) implements WithDefaultId;
>
> /**
> * The default provided id field.
> */
> private long WithDefaultId.id;
>
> /**
> * Getter for the default id.
> * @return The entity id.
> */
> @Id
> @GeneratedValue
> public long WithDefaultId.getId() {
> return id;
> }
>
> /**
> * Setter for the default id.
> * @param newId The entity id.
> */
> void WithDefaultId.setId(long newId) {
> id = newId;
> }
>
> }
>
> You can find the complete aspects (also for @Version) here :
> http://svn.apache.org/repos/asf/labs/magma/trunk/database-jpa/src/main/java/org/apache/magma/database/openjpa/
>
> Simone
>
>
>
> Matthew Adams 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
>>
>>
>
>
> --
> Simone Gianni CEO Semeru s.r.l. Apache Committer
> http://www.simonegianni.it/
>
> _______________________________________________
> 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