[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] @DeclareParents
|
Did you by any chance find the solution. I am stuck on the same problem. I am
not able to get the setter to work. Please help.
Brian Ericson wrote:
>
> Uh... I don't know that I can... I'm getting totally inexplicable
> behavior... I copied the example I'd originally sent for RC1 (a couple
> of weeks back) and reworked it to the release semantics. But now,
> rather than seeing the setter act globally, I'm seeing that the setter
> does nothing... I've sent my work so far.
>
> Mood.java
> ---------
> package moody;
>
> public enum Mood { HAPPY, JOLLY }
>
> For classic, I have the following (there are a few slight differences
> from the documention -- I've added the method declarations to the
> interface (Moody) (including the setter), added a setter implementation,
> removed "feelingMoody" (which was not needed), and eliminated some
> whitespace to make it more compact):
>
> ClassicMoodIndicator.aj
> -----------------------
> package moody;
>
> public aspect ClassicMoodIndicator {
> public interface Moody {
> Mood getMood();
> void setMood(Mood mood);
> }
>
> private Mood Moody.mood = Mood.HAPPY;
>
> public Mood Moody.getMood() { return mood; }
> public void Moody.setMood(Mood mood) { this.mood = mood; }
>
> declare parents : moody.ClassicMoodImplementor implements Moody;
> }
>
> ClassicMoodImplementor.java
> ---------------------------
> package moody;
>
> public class ClassicMoodImplementor { }
>
> For the annotation style I have (this matches the example, save the
> removal of some of the whitespace and "feelingMoody" and the addition of
> the setter):
>
> AnnotationMoodIndicator.java
> ----------------------------
> package moody;
>
> import org.aspectj.lang.annotation.Aspect;
> import org.aspectj.lang.annotation.DeclareParents;
>
> @Aspect
> public class AnnotationMoodIndicator {
> public interface Moody {
> Mood getMood();
> void setMood(Mood mood);
> }
>
> public static class MoodyImpl implements Moody {
> private Mood mood = Mood.HAPPY;
>
> public Mood getMood() { return mood; }
> public void setMood(Mood mood) { this.mood = mood; }
> }
>
>
> @DeclareParents(value="moody.AnnotationMoodImplementor",defaultImpl=MoodyImpl.class)
> private Moody implementedInterface;
> }
>
> AnnotationMoodImplementor.java
> ------------------------------
> package moody;
>
> public class AnnotationMoodImplementor { }
>
> My test class looks as follows:
>
> MoodTester.java
> ---------------
> package moody;
>
> import junit.framework.TestCase;
>
> public class MoodTester extends TestCase {
> public MoodTester(String name) { super(name); }
> public static void main(String args[]) {
> junit.textui.TestRunner.run(MoodTester.class); }
>
> public void testClassic() {
> ClassicMoodImplementor cmi0 = new ClassicMoodImplementor();
> ClassicMoodImplementor cmi1 = new ClassicMoodImplementor();
>
> assertEquals("cmi0 should be HAPPY", Mood.HAPPY, cmi0.getMood());
>
> cmi1.setMood(Mood.JOLLY);
> assertEquals("cmi1 should be JOLLY", Mood.JOLLY, cmi1.getMood());
> assertEquals("cmi0 should be *still* be HAPPY", Mood.HAPPY,
> cmi0.getMood());
> }
>
> public void testAnnotation() {
> AnnotationMoodImplementor ami0 = new AnnotationMoodImplementor();
> AnnotationMoodImplementor ami1 = new AnnotationMoodImplementor();
>
> assertEquals("ami0 should be HAPPY", Mood.HAPPY,
> ((AnnotationMoodIndicator.Moody) ami0).getMood());
>
> ((AnnotationMoodIndicator.Moody) ami1).setMood(Mood.JOLLY);
> assertEquals("ami1 should be JOLLY", Mood.JOLLY,
> ((AnnotationMoodIndicator.Moody) ami1).getMood());
> assertEquals("ami0 should be *still* be HAPPY", Mood.HAPPY,
> ((AnnotationMoodIndicator.Moody) ami0).getMood());
> }
> }
>
> The test run is as follows:
> ..F
> Time: 0.021
> There was 1 failure:
> 1) testAnnotation(moody.MoodTester)junit.framework.AssertionFailedError:
> ami1 should be JOLLY expected:<JOLLY> but was:<HAPPY>
> at moody.MoodTester.testAnnotation(MoodTester.java:27)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at moody.MoodTester.main(MoodTester.java:7)
>
> FAILURES!!!
> Tests run: 2, Failures: 1, Errors: 0
>
> I absolutely don't get why the setter had no effect... Note that it
> didn't fail on the third assert (that "ami0 should be *still* be
> HAPPY"), but on the second ("ami1 should be JOLLY")! I've confirmed
> that setMood is being invoked... So, rather than demonstrating
> "static-ness", I've only succeeded in showing that the setter does
> nothing... Help?!
>
> Alexandre Vasseur wrote:
>
>>I am not sure I follow what you mean with static advice in this context.
>>
>>Can you post the whole aspect or sample program with its
>>DeclareParents (similar to the @AspectJ one from
>>http://eclipse.org/aspectj/doc/released/adk15notebook/ataspectj-itds.html)
>>and the actual "client code" (where there will be a cast as previously
>>discussed on this thread) such as in the doc:
>>Mood mood = ((Moody)this).getMood();
>>...
>>
>>
>>Thanks
>>Alex
>>
>>
>>
>>
>>
>>On 12/23/05, Brian Ericson <bme@xxxxxxxx> wrote:
>>
>>
>>>Thanks for the quick turnaround and updates to the documentation! With
>>>the updates, the example now compiles.
>>>
>>>One last question/issue: is the annotation-style advice supposed to be
>>>static?
>>>
>>>The two examples are not equivalent (in a subtle way that wouldn't be
>>>apparent given the example, since the example has no setter)...
>>>
>>>If I implement MoodIndicator using the "classic" style and create two
>>>instances, each instance will have it's own mood (since the example has
>>>no setter, both instances' values would be Mood.HAPPY). In the
>>>annotation style, the mood is static (shared). This becomes evident if
>>>I add a setter to both styles and change the value of one of the
>>>instances, as the following pseudo code illustrates:
>>> MoodyGuy m0 = new MoodyGuy();
>>> m0.setMood(Mood.HAPPY); //the default...
>>> MoodyGuy m1 = new MoodyGuy();
>>> m1.setMood(Mood.JOLLY);
>>>
>>> if (m0.getMood() == m1.getMood()) System.out.println("Advice is
>>> static");
>>> else System.out.println("Advice is not static");
>>>
>>>For classic, this would result in "Advice is not static", but for the
>>>annotation style, this would produce "Advice is static" because setting
>>>the mood on m1 affects m0. Can the annotation-style be made non-static?
>>>
>>>Adrian Colyer wrote:
>>>
>>>
>>>
>>>>I've now fixed the docs in CVS and in the online version.
>>>>
>>>>On 22/12/05, Alexandre Vasseur <avasseur@xxxxxxxxx> wrote:
>>>>
>>>>
>>>>
>>>>
>>>>>Hi Brian
>>>>>
>>>>>I have spotted a little typo in the doc indeed.
>>>>>
>>>>>First the syntax is
>>>>>@DeclareParents(value=".....", defaultImpl=Some.class)
>>>>>that is reference the class object itself, not the fully qualified name
there.
>>>>>
>>>>>Also, the static inner class must be static and public so that the
>>>>>implicit no-arg constructor is public.
>>>>>
>>>>>Alex
>>>>>
>>>>>
>>>>>
>>>>>On 12/22/05, Brian Ericson <bme@xxxxxxxx> wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>The syntax for @DeclareParents changed slightly in the AspectJ 5
>>>>>>release. I can't get the example to compile... The first two hurdles
>>>>>>are minor:
>>>>>>o 'defaultImpl="MoodyImpl"' should be 'defaultImpl=MoodyImpl.class'
>>>>>>o 'void feelingMoody(Moody m) {' should be 'public void
>>>>>>feelingMoody(Moody m) {'
>>>>>>
>>>>>>However, having made the changes, the compilation fails because
>>>>>>'defaultImpl="MoodIndicator$MoodyImpl" has no public no-arg
>>>>>>constructor'. I've tried a number of things, but can't get beyond
this...
>>>>>>
>>>>>>Ideas?
>>>>>>_______________________________________________
>>>>>>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
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>--
>>>>-- Adrian
>>>>adrian.colyer@xxxxxxxxx
>>>>_______________________________________________
>>>>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
>>>
>>>
>>>
>>_______________________________________________
>>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
>
>
--
View this message in context: http://www.nabble.com/%40DeclareParents-tp2054983p18413555.html
Sent from the AspectJ - users mailing list archive at Nabble.com.