Community
Participate
Working Groups
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)
nice enhancement for 1.6.2 - NPE should be addressed even if the enhancement proves too tricky to implement.
Fixed for boolean and int values - will fix others as they crop up in real use cases.
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.
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.
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.
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.
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?
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.
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?
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.
(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)
committed fix for stack trace mentioned in comment 11 - will be in next dev build.
All done in here for now, closing!
*** Bug 252102 has been marked as a duplicate of this bug. ***