Bug 238992 - Annotation values in declare parents or declare @type.
Summary: Annotation values in declare parents or declare @type.
Status: RESOLVED FIXED
Alias: None
Product: AspectJ
Classification: Tools
Component: Compiler (show other bugs)
Version: 1.6.1   Edit
Hardware: PC Windows XP
: P2 normal (vote)
Target Milestone: 1.6.2   Edit
Assignee: aspectj inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
: 252102 (view as bug list)
Depends on:
Blocks:
 
Reported: 2008-06-30 10:03 EDT by Avatar CLA
Modified: 2008-11-28 19:52 EST (History)
4 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Avatar CLA 2008-06-30 10:03:25 EDT
Build ID: M20080221-1800
AJDT Version: 1.5.3.200805181553
AspectJ version: 1.6.1.20080513130000

Steps To Reproduce:
1. Create in aspect construction like:

declare parents: (@Entity(indexed=true) *) implements EntityObject;

or

declare @type : (@Entity(indexed=true) *) : @javax.persistence.Entity;


More information:
Annotation values work only in standard pointcuts. Within constructions like "declare parents" or "declare @type" they don't work. When writing this in ajdt there is an error:

java.lang.NullPointerException
	at org.aspectj.weaver.patterns.ExactAnnotationTypePattern.matches(ExactAnnotationTypePattern.java:126)
	at org.aspectj.weaver.patterns.ExactAnnotationTypePattern.matches(ExactAnnotationTypePattern.java:94)
	at org.aspectj.weaver.patterns.AnyWithAnnotationTypePattern.matchesExactly(TypePattern.java:478)
	at org.aspectj.weaver.patterns.TypePattern.matchesStatically(TypePattern.java:121)
	at org.aspectj.weaver.patterns.DeclareParents.match(DeclareParents.java:62)
	at org.aspectj.weaver.patterns.DeclareParents.findMatchingNewParents(DeclareParents.java:338)
	at org.aspectj.ajdt.internal.compiler.lookup.AjLookupEnvironment.doDeclareParents(AjLookupEnvironment.java:710)
	at org.aspectj.ajdt.internal.compiler.lookup.AjLookupEnvironment.weaveInterTypeDeclarations(AjLookupEnvironment.java:589)
	at org.aspectj.ajdt.internal.compiler.lookup.AjLookupEnvironment.weaveIntertypes(AjLookupEnvironment.java:370)
	at org.aspectj.ajdt.internal.compiler.lookup.AjLookupEnvironment.completeTypeBindings(AjLookupEnvironment.java:217)
	at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.internalBeginToCompile(Compiler.java:605)
	at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.beginToCompile(Compiler.java:357)
	at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:371)
	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:990)
	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild(AjBuildManager.java:264)
	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild(AjBuildManager.java:216)
	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.incrementalBuild(AjBuildManager.java:187)
	at org.aspectj.ajde.core.internal.AjdeCoreBuildManager.doBuild(AjdeCoreBuildManager.java:97)
	at org.aspectj.ajde.core.AjCompiler.build(AjCompiler.java:118)
	at org.eclipse.ajdt.core.builder.AJBuilder.build(AJBuilder.java:205)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:624)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:166)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:197)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:246)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:249)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:302)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:334)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:137)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:235)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
Comment 1 Andrew Clement CLA 2008-06-30 12:34:22 EDT
nice enhancement for 1.6.2 - NPE should be addressed even if the enhancement proves too tricky to implement.
Comment 2 Andrew Clement CLA 2008-07-07 18:33:46 EDT
Fixed for boolean and int values - will fix others as they crop up in real use cases.
Comment 3 Avatar CLA 2008-07-31 04:36:26 EDT
I tried this with new ajdt (1.5.4.200807291435 with aspectj 1.6.2.20080729100000).
When defining declares with annotation value (of type boolean), ajdt show bug:
org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType$MissingImplementationException: Please raise an AspectJ bug.  AspectJ does not know how to convert this annotation value ["User"]
	at org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType.generateElementValue(EclipseSourceType.java:676)
	at org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType.generateAnnotation(EclipseSourceType.java:626)
	at org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType.convertEclipseAnnotation(EclipseSourceType.java:602)
	at org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType.getAnnotations(EclipseSourceType.java:582)
	at org.aspectj.weaver.ReferenceType.getAnnotationOfType(ReferenceType.java:160)
	at org.aspectj.weaver.patterns.ExactAnnotationTypePattern.matches(ExactAnnotationTypePattern.java:116)
	at org.aspectj.weaver.patterns.ExactAnnotationTypePattern.matches(ExactAnnotationTypePattern.java:91)
	at org.aspectj.weaver.patterns.AnyWithAnnotationTypePattern.matchesExactly(TypePattern.java:478)
	at org.aspectj.weaver.patterns.TypePattern.matchesStatically(TypePattern.java:121)
	at org.aspectj.weaver.patterns.DeclareParents.match(DeclareParents.java:62)
	at org.aspectj.weaver.patterns.DeclareParents.findMatchingNewParents(DeclareParents.java:338)
	at org.aspectj.ajdt.internal.compiler.lookup.AjLookupEnvironment.doDeclareParents(AjLookupEnvironment.java:703)
	at org.aspectj.ajdt.internal.compiler.lookup.AjLookupEnvironment.weaveInterTypeDeclarations(AjLookupEnvironment.java:582)
	at org.aspectj.ajdt.internal.compiler.lookup.AjLookupEnvironment.weaveIntertypes(AjLookupEnvironment.java:363)
	at org.aspectj.ajdt.internal.compiler.lookup.AjLookupEnvironment.completeTypeBindings(AjLookupEnvironment.java:217)
	at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.internalBeginToCompile(Compiler.java:605)
	at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.beginToCompile(Compiler.java:357)
	at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:371)
	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:992)
	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild(AjBuildManager.java:266)
	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:181)
	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild(AjBuildManager.java:304)
	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.incrementalBuild(AjBuildManager.java:188)
	at org.aspectj.ajde.core.internal.AjdeCoreBuildManager.doBuild(AjdeCoreBuildManager.java:97)
	at org.aspectj.ajde.core.AjCompiler.build(AjCompiler.java:118)
	at org.eclipse.ajdt.core.builder.AJBuilder.build(AJBuilder.java:214)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:624)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:166)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:197)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:246)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:249)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:302)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:334)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:137)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:235)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

Also we'd need string values in annotations.
Comment 4 Andrew Clement CLA 2008-07-31 10:36:23 EDT
OK, I'll look to do strings too.  Every situation needs a bunch of special code and new tests, that is why I'm not doing them all in one go.
Comment 5 Andrew Clement CLA 2008-07-31 15:17:55 EDT
I'm just a little bit confused when I read your description:

> When defining declares with annotation value (of type boolean), ajdt show bug:
> org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType$MissingImplementationException:
> Please raise an AspectJ bug.  AspectJ does not know how to convert this
> annotation value ["User"]

when definiing declares with annotation value of type *boolean* - do you really mean boolean there?  I've added support for string now (committed it), but I don't understand why you'd get a string error if working with a boolean anno value.  If you did mean boolean, can you attach a bit of testcode so I can add a testcase?  Here is mine for the latest problem and it now runs fine:

---8<---
import java.lang.annotation.*;
import java.io.*;

@Entity(s="xxx")
public class Foo5 {
  public static void main(String []argv) {
    Foo5 f = new Foo5();
    Goo g = new Goo();
    if (f instanceof Serializable) {
       throw new RuntimeException("Foo5 should not implement it");        
    }
    if (!(g instanceof Serializable)) {
       throw new RuntimeException("Goo should implement it");        
    }
    if (!(new Hoo() instanceof Serializable)) {
       throw new RuntimeException("Hoo should implement it");        
    }
  }
}

@Entity(s="yyy")
class Goo {
}

@Entity // default is "yyy"
class Hoo {
}

@Retention(RetentionPolicy.RUNTIME)
@interface Entity {
  String s() default "yyy";
}

aspect X {
  declare parents: (@Entity(s="yyy") *) implements java.io.Serializable;
}

---8<---

I suppose it might be because you have annotations elsewhere that have a string value - even though you don't use them in your decp statement, hmmmm.

Comment 6 Avatar CLA 2008-08-01 04:03:57 EDT
I've got annotation:
@Target({ElementType.TYPE})
@Retention(RUNTIME)
public @interface Entity{
  //String errorCode() default "net.sf.oval.constraints.NotNull";

  String objectStoreName() default "hibernate";

  boolean indexed() default true;

}

and have aspect:
public aspect EntityEnablerAspect {

  declare parents: (@Entity *) implements EntityObject;
}

It works well. But if I change it into:

public aspect EntityEnablerAspect {

  declare parents: (@Entity(indexed=true) *) implements EntityObject;
}

Then when saving file in Eclipse, there is an exception in ajdt editor, I pasted before.
Comment 7 Andrew Clement CLA 2008-08-18 11:49:46 EDT
I'm afraid that isn't enough for me to go on.  I tried creating a simple test around your two types:

import java.lang.annotation.*;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity{
  //String errorCode() default "net.sf.oval.constraints.NotNull";

  String objectStoreName() default "hibernate";

  boolean indexed() default true;

}


@Entity
class C {
}

public aspect EntityEnablerAspect {

  declare parents: (@Entity(indexed=true) *) implements EntityObject;
  interface EntityObject {}
}

and it compiles fine.  And when you say you get the same error as before - do you mean the NPE:
java.lang.NullPointerException
        at
org.aspectj.weaver.patterns.ExactAnnotationTypePattern.matches(ExactAnnotationTypePattern.java:126)
        at
org.aspectj.weaver.patterns.ExactAnnotationTypePattern.matches(ExactAnnotationTypePattern.java:94)
        at

or the 
org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType$MissingImplementationException:
Please raise an AspectJ bug.  AspectJ does not know how to convert this
annotation value ["User"]
        at
org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType.generateElementValue(EclipseSourceType.java:676)

and is the stack trace identical, ie. the line number for the first entry is the same in the new case?

Comment 8 Avatar CLA 2008-09-22 09:14:37 EDT
I tried ajdt 1.6.0.200809031144 with aspectj 1.6.2.20080828190000. It seems to be working well (for boolean and string parameters). But I found one bug. If I define more than one "declare" construction in one aspect, for example:

  declare parents: (@Entity *) implements EntityObject;
  declare parents: (@Entity *) implements IdentityAware;
  declare @type : (@Entity *) : @javax.persistence.Entity;

Then parameter values added to FIRST line are propagated to others. For example:

  declare parents: (@Entity(indexed=true) *) implements EntityObject;
  declare parents: (@Entity *) implements IdentityAware;
  declare @type : (@Entity *) : @javax.persistence.Entity;

Now indexed=true is used during resolving all three constructions. But when I write:

  declare parents: (@Entity *) implements EntityObject;
  declare parents: (@Entity(indexed=true) *) implements IdentityAware;
  declare @type : (@Entity *) : @javax.persistence.Entity;

then indexed=true is used only in second line, like it should. Other two constructions accept any values, like they should. 
Using right order of lines you can make it work as desired, but that's kind of work around.
Comment 9 Andrew Clement CLA 2008-09-22 14:27:25 EDT
i'm trying to recreate that, but it wont fail for me.  Program is:

---8<---
import java.lang.annotation.*;


@Retention(RetentionPolicy.RUNTIME)
@interface Entity {
  boolean indexed() default true;
}


@Entity(indexed=true)
public class Code {
}

@interface Entity2 {}

interface I1 {}

interface I2 {}

aspect X {
  declare parents: (@Entity(indexed=false) *) implements I1;
  declare parents: (@Entity *) implements I2;
  declare @type: (@Entity *): @Entity2;
}
---8<---

and on compilation I see I2 and Entity2 added to the class Code - indicating it is not using the 'indexed=false' specified in the first decp.


Do you see this on full builds or only incremental builds?
Comment 10 Avatar CLA 2008-09-23 03:51:49 EDT
It seems to be my aspect's problem. If one "declare" isn't applied to some classes, others aren't also (in ajdt). If changed order of "declare" lines - still the one with EntityObject is causing trouble.
So you may probably close this bug.
Comment 11 ken horn CLA 2008-09-28 09:49:33 EDT
(Hoping this is the correct bug to report this on..)

Another case:

org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType$MissingImplementationException
at org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType.generateAnnotation(EclipseSourceType.java:640)
at org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType.convertEclipseAnnotation(EclipseSourceType.java:609)
at org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType.getAnnotations(EclipseSourceType.java:590)
at org.aspectj.wea ... ementationException thrown: Please raise an AspectJ bug.  AspectJ does not know how to convert this annotation [@org.aspectj.lang.annotation.Aspect()]


org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType$MissingImplementationException: Please raise an AspectJ bug.  AspectJ does not know how to convert this annotation [@org.aspectj.lang.annotation.Aspect()]
        at org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType.generateAnnotation(EclipseSourceType.java:640)
        at org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType.convertEclipseAnnotation(EclipseSourceType.java:609)
        at org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType.getAnnotations(EclipseSourceType.java:590)
        at org.aspectj.weaver.ReferenceType.getAnnotations(ReferenceType.java:145)
        at org.aspectj.weaver.bcel.Utility.isSuppressing(Utility.java:736)
        at org.aspectj.weaver.bcel.BcelWeaver.warnOnUnmatchedAdvice(BcelWeaver.java:1287)
        at org.aspectj.weaver.bcel.BcelWeaver.allWeavingComplete(BcelWeaver.java:1231)
        at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.postWeave(AjPipeliningCompilerAdapter.java:507)
        at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.afterCompiling(AjPipeliningCompilerAdapter.java:315)
        at org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$afterReturning$org_aspectj_ajdt_internal_compiler_CompilerAdapter$2$f9cc9ca0(CompilerAdapter.aj:73)
        at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:430)
        at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:1011)
        at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild(AjBuildManager.java:295)
        at org.aspectj.ajdt.internal.core.builder.AjBuildManager.incrementalBuild(AjBuildManager.java:188)
        at org.aspectj.ajde.core.internal.AjdeCoreBuildManager.doBuild(AjdeCoreBuildManager.java:114)
        at org.aspectj.ajde.core.AjCompiler.build(AjCompiler.java:118)
        at org.eclipse.ajdt.core.builder.AJBuilder.build(AJBuilder.java:211)
        at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:633)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
        at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:170)
        at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:201)
        at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:253)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
        at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:256)
        at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:309)
        at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:341)
        at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:140)
        at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:238)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
Comment 12 Andrew Clement CLA 2008-09-28 14:30:50 EDT
committed fix for stack trace mentioned in comment 11 - will be in next dev build.
Comment 13 Andrew Clement CLA 2008-09-30 16:02:04 EDT
All done in here for now, closing!
Comment 14 Andrew Clement CLA 2008-11-28 19:52:08 EST
*** Bug 252102 has been marked as a duplicate of this bug. ***