Bug 392677 - Weaving Spring Data Neo4j aspects in scalac compiled bytecode failing
Summary: Weaving Spring Data Neo4j aspects in scalac compiled bytecode failing
Status: NEW
Alias: None
Product: AspectJ
Classification: Tools
Component: Compiler (show other bugs)
Version: 1.7.1   Edit
Hardware: Macintosh Mac OS X
: P3 major (vote)
Target Milestone: ---   Edit
Assignee: aspectj inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-10-23 13:20 EDT by Julien Jean Paul Sirocchi CLA
Modified: 2012-10-23 13:25 EDT (History)
1 user (show)

See Also:


Attachments
failing weaving (2.46 KB, application/zip)
2012-10-23 13:20 EDT, Julien Jean Paul Sirocchi CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
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