Bug 392677

Summary: Weaving Spring Data Neo4j aspects in scalac compiled bytecode failing
Product: [Tools] AspectJ Reporter: Julien Jean Paul Sirocchi <julien.sirocchi>
Component: CompilerAssignee: aspectj inbox <aspectj-inbox>
Status: NEW --- QA Contact:
Severity: major    
Priority: P3 CC: julien.sirocchi
Version: 1.7.1   
Target Milestone: ---   
Hardware: Macintosh   
OS: Mac OS X   
Whiteboard:
Attachments:
Description Flags
failing weaving none

Description Julien Jean Paul Sirocchi CLA 2012-10-23 13:20:25 EDT
Created attachment 222686 [details]
failing weaving

mvn clean package to reproduce (Dummy.java is a "quick 'n dirty hack" for forcing org.codehaus.mojo:aspectj-mavan-plugin:1.4 to launch ajc

Context:
scala class annotated with javax.persistence.* and org.springframework.data.neo4j.annotations.*

What's going on:
1. Person.scala gets compiled with scalac 2.9.2, .class file is sent to unwoven-classes

2. javap on target/unwoven-classes/Person.class shows:
Compiled from "Person.scala"
public class Person extends java.lang.Object implements scala.ScalaObject{
    public java.lang.Long id();
    public void id_$eq(java.lang.Long);
    public void setId(java.lang.Long);
    public java.lang.Integer version();
    public void version_$eq(java.lang.Integer);
    public void setVersion(java.lang.Integer);
    public java.lang.String lastName();
    public void lastName_$eq(java.lang.String);
    public void setLastName(java.lang.String);
    public java.lang.String username();
    public void username_$eq(java.lang.String);
    public void setUsername(java.lang.String);
    public java.lang.String getUsername();
    public java.lang.String getLastName();
    public java.lang.Integer getVersion();
    public java.lang.Long getId();
    public Person();
}

3. aspectj 1.7.1 weaver tries to weave aspects contained in org.springframework.data:spring-data-neo4j-aspects:2.1.0-RELEASE into the unwoven classes failing to do so with:
[ERROR] error at /Person.scala::0 The type Person must implement the inherited abstract method org.springframework.data.neo4j.aspects.core.GraphBacked.setPersistentState(Ljava/lang/Object;)
[ERROR] see also: org/springframework/data/neo4j/aspects/core/GraphBacked.java:35::1348
[ERROR] see also: org/springframework/data/neo4j/aspects/support/node/Neo4jNodeBacking.aj:66::0
[ERROR] error at /Person.scala::0 The type Person must implement the inherited abstract method org.springframework.data.neo4j.mapping.ManagedEntity.setPersistentState(Ljava/lang/Object;)
[ERROR] see also: org/springframework/data/neo4j/mapping/ManagedEntity.java::0
[ERROR] see also: org/springframework/data/neo4j/aspects/support/node/Neo4jNodeBacking.aj:66::0

4. javap on target/classes/Person.class shows it has done something (some static crosscutting at least) but Person does not look like it's implementing NodeBacked... (there's a "declare parents : (@NodeEntity *) implements NodeBacked;" in org.springframework.data.neo4j.aspects.support.node.Neo4jNodeBacking.aj:
Compiled from "Person.scala"
public class Person extends java.lang.Object implements scala.ScalaObject{
    public transient org.springframework.data.neo4j.core.EntityState entityState;
    public java.lang.Long id();
    public void id_$eq(java.lang.Long);
    public void setId(java.lang.Long);
    public java.lang.Integer version();
    public void version_$eq(java.lang.Integer);
    public void setVersion(java.lang.Integer);
    public java.lang.String lastName();
    public void lastName_$eq(java.lang.String);
    public void setLastName(java.lang.String);
    public java.lang.String username();
    public void username_$eq(java.lang.String);
    public void setUsername(java.lang.String);
    public java.lang.String getUsername();
    public java.lang.String getLastName();
    public java.lang.Integer getVersion();
    public java.lang.Long getId();
    public Person();
    public org.springframework.data.neo4j.core.EntityState ajc$interFieldGet$org_springframework_data_neo4j_aspects_support_node_Neo4jNodeBacking$org_springframework_data_neo4j_aspects_core_NodeBacked$entityState();
    public void ajc$interFieldSet$org_springframework_data_neo4j_aspects_support_node_Neo4jNodeBacking$org_springframework_data_neo4j_aspects_core_NodeBacked$entityState(org.springframework.data.neo4j.core.EntityState);
    static {};
    public boolean equals(java.lang.Object);
    public java.lang.Iterable findAllByQuery(java.lang.String, java.lang.Class, java.util.Map);
    public java.lang.Iterable findAllByQuery(java.lang.String, java.util.Map);
    public java.lang.Iterable findAllByTraversal(java.lang.Class, org.neo4j.graphdb.traversal.TraversalDescription);
    public java.lang.Iterable findAllPathsByTraversal(org.neo4j.graphdb.traversal.TraversalDescription);
    public java.lang.Object findByQuery(java.lang.String, java.lang.Class, java.util.Map);
    public org.springframework.data.neo4j.core.EntityState getEntityState();
    public java.lang.Long getNodeId();
    public org.neo4j.graphdb.Node getPersistentState();
    public org.springframework.data.neo4j.aspects.core.RelationshipBacked getRelationshipTo(org.springframework.data.neo4j.aspects.core.NodeBacked, java.lang.Class, java.lang.String);
    public org.neo4j.graphdb.Relationship getRelationshipTo(org.springframework.data.neo4j.aspects.core.NodeBacked, java.lang.String);
    public org.springframework.data.neo4j.support.Neo4jTemplate getTemplate();
    public boolean hasPersistentState();
    public int hashCode();
    public org.springframework.data.neo4j.aspects.core.NodeBacked persist();
    public org.springframework.data.neo4j.aspects.core.NodeBacked projectTo(java.lang.Class);
    public org.springframework.data.neo4j.aspects.core.RelationshipBacked relateTo(org.springframework.data.neo4j.aspects.core.NodeBacked, java.lang.Class, java.lang.String);
    public org.springframework.data.neo4j.aspects.core.RelationshipBacked relateTo(org.springframework.data.neo4j.aspects.core.NodeBacked, java.lang.Class, java.lang.String, boolean);
    public org.neo4j.graphdb.Relationship relateTo(org.springframework.data.neo4j.aspects.core.NodeBacked, java.lang.String);
    public org.neo4j.graphdb.Relationship relateTo(org.springframework.data.neo4j.aspects.core.NodeBacked, java.lang.String, boolean);
    public void remove();
    public void removeRelationshipTo(org.springframework.data.neo4j.aspects.core.NodeBacked, java.lang.String);
    public void setPersistentState(org.neo4j.graphdb.Node);
}

5. Tried also running ajc manually, same issue:
ajc -classpath ~/.m2/repository/org/aspectj/aspectjrt/1.7.1/aspectjrt-1.7.1.jar:~/.m2/repository/org/springframework/data/spring-data-neo4j-aspects/2.1.0.RELEASE/spring-data-neo4j-aspects-2.1.0.RELEASE.jar:~/.m2/repository/org/springframework/data/spring-data-neo4j/2.1.0.RELEASE/spring-data-neo4j-2.1.0.RELEASE.jar:~/.m2/repository/org/hibernate/javax/persistence/hibernate-jpa-2.0-api/1.0.1.Final/hibernate-jpa-2.0-api-1.0.1.Final.jar:~/.m2/repository/org/scala-lang/scala-library/2.9.2/scala-library-2.9.2.jar -aspectpath ~/.m2/repository/org/springframework/data/spring-data-neo4j-aspects/2.1.0.RELEASE/spring-data-neo4j-aspects-2.1.0.RELEASE.jar -inpath ./target/unwoven-classes -d ./target/classes

Apologies for the pom.xml cluttered, I've tried to extract the minimum stuff needed to reproduce the problem but I'm sure there's more that can go away. I just hope it's not going to distract.

Cheers
\j