[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
RE: [aspectj-users] More precedence

Nicholas,

Thanks again for the test case [discussed on the dev list].
As for your "by the way" question:

In general, if you're dealing with a hierarchy of aspects,
you'll want to use the + operator.  So in your case just
saying

    declare dominates: Super, B;

won't do anything if Super is not a concrete aspect.  But
using

    declare dominates: Super+, B;

will be fine.

No error will be shown for putting a non-aspect type into
the list, specifically to allow using marker interfaces to
pick out aspects for the list.

    interface ReallyImportant {}

    aspect ReallyImportantCoordination {
        declare dominates: ReallyImportant+, *;
    }

    aspect Roles {
        declare parents:
            Security implements ReallyImportant;
    }

We probably should add "using a non-aspect type without a +
in a dominates clause" to our Xlint warnings.

-erik

-----Original Message-----
From: Lesiecki Nicholas [mailto:ndlesiecki@xxxxxxxxx]
Sent: Tuesday, 31 December, 2002 11:42 am
Subject: RE: [aspectj-users] More precedence


I can try to turn the example into a precedence test
case. It may take a few days as I'm under a deadline.

By the way, does it have any meaning to put:

 aspect Dominates {
     declare dominates : Super, B;  // No +
 }

The changes page refered to the fact that only concrete
aspects are affected by precedence. Does this mean that
Super (no plus) is illegal or meaningless? Or does it mean
the same as Super+?

Also, what should happen if you put a non-aspect type into
the list?

Can I use a marker interface to pick out aspects for the
list?


Cheers,
Nick

-----Original Message-----
--- Jim.Hugunin@xxxxxxxx wrote:

This is a bug as Wes says.  It's fixed in the current
version of the compiler in cvs.  It was a simple matter of
using the wrong API for type pattern matching in the
implementation of declare dominates.

The test suite would benefit from a more extensive test than
we currently have for this precedence case.  If Nick could
turn his example into something that would throw an
exception if the precedence was wrong that would be good.

-Jim

-----Original Message-----
From: isberg@xxxxxxxx [mailto:isberg@xxxxxxxx]
Sent: Tuesday, December 31, 2002 9:36 AM
Subject: RE: [aspectj-users] More precedence

It looks to me like

  declare dominates : Super+, ...

is just broken now.  Anyone care to submit a bug?

Wes
------------- DominatesAdvice.java

    public class DominatesAdvice {
        public static void main (String[] args) {
            new C().run();
        }
        pointcut run() : target(C) && call(void run());
        static void log(String s) {
            System.out.println(""+s);
        }
    }

    class C { void run() {}}
    class Super {}
    aspect A extends Super {
        before () : DominatesAdvice.run() {
            DominatesAdvice.log("A");
        }
    }
    aspect B {
        before () : DominatesAdvice.run() {
            DominatesAdvice.log("B");
        }

    aspect Dominates {
        declare dominates : Super+, B;  // BUG: produces B, A
        //declare dominates : A, B;  // ok: produces A, B
    }


-----Original Message-----
From: Lesiecki Nicholas [mailto:ndlesiecki@xxxxxxxxx]
Sent: Tuesday, December 31, 2002 8:36 AM
Subject: RE: [aspectj-users] More precedence


Hello All,

Sorry, my message got truncated. Unfortunately I've left the
sample code at home.

The upshot is that for:

declare dominates : Security+, *;

the precedence appears to be:

Tracing
Notification
MoreSecurity
CustomSecurity
Security (abstract)
Security (a second time)
(JoinPoint)

i.e. Security LAST.

For:

declare dominates : *Security*, *;

The order is:

MoreSecurity
CustomSecurity
Security (abstract)
Security (a second time)
Tracing
Notification
(JoinPoint)

i.e. Security FIRST.

Why should Security+ and *Security* produce different
results? They both (should) select the same set of Concrete
aspects (CustomSecurity and MoreSecurity). Am I missing
something?

BTW, the sample code is ridiculously simple. Each aspect has
a single piece of before advice that prints what it's doing
to the console.  All of the advice affects call(void
doSomething()). The only doSomething() method in the
compilation unit appears in SomeObject.

SomeObject's main:
main(){
  new SomeObject().doSomething();
}

Cheers,
nick


-----Original Message-----
--- isberg@xxxxxxxx wrote:

Did the mailing list clip this question?
Did you decide against it, after accidental send?

(btw, thanks for the bugs)

Wes

-----Original Message-----
From: Lesiecki Nicholas [mailto:
Sent: Monday, December 30, 2002 9:16 PM
Subject: [aspectj-users] More precedence


Ok, I have several aspects that affect a single join point.
They all define a single piece of before advice that prints
a message about what they're doing.

Aspects:

Security (abstract)
|
--CustomSecurity
|
--MoreSecurity

Tracing

Notification

I have the following declaration:

declare dominates : Security+, *;