Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] How can I use 'declare' to verify that a class implements a certain interface?

Hi Wes

Thanks for the solution, it works wonders :)

/Jeppe

Wes Isberg wrote:
Hi -

See EI.java below: it puts the predicate in the type
pattern for the staticinitialization pointcut.  You were
correct to use staticinitialization; there is such a join
point in every class.  Using within() alone will pick out
all join points in an offending class, which is probably
not what you want.

hth - Wes

(P.S. - it works for marker interfaces, too.)

------------------------------------ compiling EI.java
 src $ aspectj-1.5 -1.5 EI.java
C:\home\wes\src\EI.java:7 [error]  E is I
@Entity class CE {}
              ^
        staticinitialization(void CE.<clinit>())
        see also: C:\home\wes\src\EI.java:10::0

1 error
---------------------- EI.java

@interface Entity {}
interface I {}

class C {}
class CI implements I {}
@Entity class CE {}
@Entity class CEI implements I {}
aspect A {
    declare error : 
        staticinitialization((@Entity *) && !(I+)) 
        : " E is I";
    // hmm not sure why this doesn't work
    //declare error : 
       //staticinitialization(@Entity !(I+)) : " E is I";
}

On Sun, 8 Jan 2006 09:51:49 -0600
 Dean Wampler <deanwampler@xxxxxxxxx> wrote:
  
This appears to work:

public aspect ModelCheck {
	declare error:
		 within (@Entity mypackage.*) &&
		!within(mypackage.MyInterface+): "Must implement
MyInterface";
}

but note that this doesn't:

	declare error:
		 within (@Entity !mypackage.mypackage.MyInterface+):
"Must implement
MyInterface";

As an alternative, you could be more more optimistic: ;)

declare parents: (@Entity *) implements MyInterface

Then you'll get a regular compiler error for those
classes that
"forget" to implement the interfaces methods. This may
not meet your
needs if the interface is an empty marker interface, in
which case
you'll get no errors!

dean


On 1/8/06, Jeppe Cramon <jeppe@xxxxxxxxx> wrote:
    
Hi

 I've stumbled across the need to enforce a contract,
      
using declare error,
    
that all classes that have the @Entity  annotation also
      
needs to implement a
    
certain interface (here called MyInterface). Since
      
this() can't be used with
    
declare, I've tried to use staticinitialization()
      
instead, but it doesn't
    
work.

 Does any one have a suggestion on how to implement
      
such a check?
    
 Here's the sample aspect:
 package com.betchallenge.model;

 import com.myproject.MyInterface;
 import javax.persistence.Entity;

 public aspect ModelCheck {
    declare error: within(@Entity *) &&
!staticinitialization(MyInterface):
        "An Entity must implement MyInterface";
 }

 Thanks in advance :)

 Best regards

 Jeppe


_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users



      
--
Dean Wampler
http://www.aspectprogramming.com
http://www.newaspects.com
http://www.contract4j.org
_______________________________________________
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

  

Back to the top