You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2007/12/24 19:33:32 UTC

svn commit: r606722 - /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/enhancer/EmbeddableVisitor.java

Author: aadamchik
Date: Mon Dec 24 10:33:30 2007
New Revision: 606722

URL: http://svn.apache.org/viewvc?rev=606722&view=rev
Log:
JPA: adding check for attempted double enhancement of embeddables

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/enhancer/EmbeddableVisitor.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/enhancer/EmbeddableVisitor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/enhancer/EmbeddableVisitor.java?rev=606722&r1=606721&r2=606722&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/enhancer/EmbeddableVisitor.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/enhancer/EmbeddableVisitor.java Mon Dec 24 10:33:30 2007
@@ -18,9 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.enhancer;
 
+import java.util.ArrayList;
+import java.util.Collection;
+
 import org.apache.cayenne.Persistent;
 import org.objectweb.asm.ClassAdapter;
 import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.FieldVisitor;
 
 /**
  * Enhances classes passed through the visitor to add embeddable fields and methods needed
@@ -31,16 +35,56 @@
  */
 public class EmbeddableVisitor extends ClassAdapter {
 
+    private static String OWNER_FEILD = "owner";
+    private static String EMBEDDED_PROPERTY_FEILD = "embeddedProperty";
+
     protected EnhancementHelper helper;
+    protected Collection<String> reservedFieldNames;
+    protected boolean checkReserved;
 
     public EmbeddableVisitor(ClassVisitor visitor) {
         super(visitor);
         this.helper = new EnhancementHelper(this);
+        this.checkReserved = true;
+
+        this.reservedFieldNames = new ArrayList<String>(2);
+        reservedFieldNames.add(helper.getPropertyField(OWNER_FEILD));
+        reservedFieldNames.add(helper.getPropertyField(EMBEDDED_PROPERTY_FEILD));
+    }
+
+    /**
+     * Checks that no double enhancement happens.
+     */
+    @Override
+    public FieldVisitor visitField(
+            int access,
+            String name,
+            String desc,
+            String signature,
+            Object value) {
+
+        if (checkReserved && reservedFieldNames.contains(name)) {
+            throw new DoubleEnhanceException("Embeddable class already contains field "
+                    + name);
+        }
+
+        return super.visitField(access, name, desc, signature, value);
     }
 
     @Override
     public void visitEnd() {
-        helper.createField(Persistent.class, "owner");
-        helper.createField(String.class, "embeddedProperty");
+
+        // 'checkReserved' flipping makes the visitor thread-unsafe... pay attention if
+        // we are to ever reuse the visitor for multiple classes...
+
+        checkReserved = false;
+
+        try {
+            helper.createField(Persistent.class, OWNER_FEILD);
+            helper.createField(String.class, EMBEDDED_PROPERTY_FEILD);
+        }
+        finally {
+            checkReserved = true;
+        }
     }
 }