Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] @DeclareParents static?

I'm trying to understand the Moody example. My problem is that, when using the annotation style, everyone's CONFUSED -- if I confuse one instance, they all become confused (the advice is static)...

The classic makes sense (I'm using RC1):

Mood.java
---------
package moodytest;

public enum Mood { HAPPY, SAD, CONFUSED }

ClassicMoodIndicator.aj
-----------------------
package moodytest;

public aspect ClassicMoodIndicator {
  public interface Moody {}
private Mood Moody.mood = Mood.HAPPY; public Mood Moody.getMood() { return mood; }
  public void Moody.setMood(Mood mood) { this.mood = mood; }
declare parents : moodytest.ClassicMoodyImplementor implements Moody;
}

ClassicMoodImplementor.java
---------------------------
package moodytest;

public class ClassicMoodyImplementor { }

ClassicMoodTester.java
----------------------
package moodytest;

import junit.framework.TestCase;

public class ClassicMoodTester extends TestCase {
  ClassicMoodyImplementor cmi0 = null;
  ClassicMoodyImplementor cmi1 = null;
public ClassicMoodTester(String name) { super(name); }

  protected void setUp() throws Exception {
     cmi0 = new ClassicMoodyImplementor();
     cmi1 = new ClassicMoodyImplementor();
  }

  public void testHappyDefault() {
     assertEquals("cmi0 should be happy!", Mood.HAPPY, cmi0.getMood());
  }
public void testOneConfused() {
     cmi0.setMood(Mood.CONFUSED);
assertEquals("cmi0 should now be confused", Mood.CONFUSED, cmi0.getMood()); assertEquals("cmi1 should still be happy", Mood.HAPPY, cmi1.getMood());
  }
}

As expected, all ClassicMoodTester tests run successfully. Now, for the annotation style...

AnnotationMoodIndicator.java
----------------------------
package moodytest;

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 class MoodyImpl implements Moody {
     Mood mood = Mood.HAPPY;
public Mood getMood() { return mood; }
     public void setMood(Mood mood) { this.mood = mood; }
  }
@DeclareParents("moodytest.AnnotationMoodyImplementor") public static Moody introduced = new AnnotationMoodIndicator().new MoodyImpl();
}

AnnotationMoodyImplementor.java
-------------------------------
package moodytest;

public class AnnotationMoodyImplementor { }

AnnotationMoodTester.java
-------------------------
package moodytest;

import junit.framework.TestCase;

public class AnnotationMoodTester extends TestCase {
  AnnotationMoodyImplementor ami0 = null;
  AnnotationMoodyImplementor ami1 = null;
public AnnotationMoodTester(String name) { super(name); }

  protected void setUp() throws Exception {
     ami0 = new AnnotationMoodyImplementor();
     ami1 = new AnnotationMoodyImplementor();
  }

  public void testHappyDefault() {
     assertEquals("ami0 should be happy!", Mood.HAPPY, ami0.getMood());
  }
public void testOneConfused() {
     ami0.setMood(Mood.CONFUSED);
assertEquals("ami0 should now be confused", Mood.CONFUSED, ami0.getMood()); assertEquals("ami1 should still be happy", Mood.HAPPY, ami1.getMood());
  }
}

Now, running the AnnotationMoodTester tests results in the following:
..F
Time: 0.021
There was 1 failure:
1) testOneConfused(moodytest.AnnotationMoodTester)junit.framework.AssertionFailedError: ami1 should still be happy expected:<HAPPY> but was:<CONFUSED> at moodytest.AnnotationMoodTester.testOneConfused(AnnotationMoodTester.java:23)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

FAILURES!!!
Tests run: 2,  Failures: 1,  Errors: 0

Am I missing something, or is it intended that the introduction be static -- that all instances will always be of the same mood? Can I make the introduction non-static?

P.S. AnnotationMoodTester will not compile using AJDT (I get an internal compiler error at the beginning of the class), but compiles fine by hand.

P.P.S. I cannot compile all of the above classes in one pass using ajc. I need to first compile all but the tests, then compile the tests or the tests will not compile. Is this expected?


Back to the top