You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2006/08/04 23:14:48 UTC

svn commit: r428886 - /incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java

Author: ppoddar
Date: Fri Aug  4 14:14:48 2006
New Revision: 428886

URL: http://svn.apache.org/viewvc?rev=428886&view=rev
Log:
Added provisions for auxiliary enhancers to omit specific methods to be enhanced

Modified:
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java?rev=428886&r1=428885&r2=428886&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java Fri Aug  4 14:14:48 2006
@@ -536,14 +536,14 @@
         // look through all methods; this is done before any methods are added
         // so we don't need to worry about excluding synthetic methods.
         BCMethod[] methods = _pc.getDeclaredMethods();
+        Set nonEnhancedMethods = getUnenhancedMethods();
         Code code;
         for (int i = 0; i < methods.length; i++) {
             code = methods[i].getCode(false);
 
-            // don't modify some of the InstanceCallbacks methods
+            // don't modify the methods specified by the auxiliary enhancers
             if (code != null
-                && !(PRE + "PostLoad").equals(methods[i].getName())
-                && !(PRE + "PreClear").equals(methods[i].getName())) {
+            	&& !nonEnhancedMethods.contains(methods[i].getName())) {
                 replaceAndValidateFieldAccess(code, get, true, stat);
                 replaceAndValidateFieldAccess(code, put, false, stat);
             }
@@ -2608,23 +2608,47 @@
     }
 
     /**
+     * Gets the auxiliary enhancers registered as {@link Services services}.
+     * Multi-call safe -- the first call locates the auxiliary enhancers,
+     * subsequent calls merely returns the existing set.
+     * 
+     * @return array of auxiliary enhancers. empty array if none is registered.
+     */
+    public AuxiliaryEnhancer[] getAuxiliaryEnhancers() {
+		if (_auxEnhancers == null) {
+		    try {
+			Class[] classes = Services
+			    .getImplementorClasses(AuxiliaryEnhancer.class);
+			_auxEnhancers = new AuxiliaryEnhancer[classes.length];
+			for (int i = 0; i < _auxEnhancers.length; i++)
+			    _auxEnhancers[i] = (AuxiliaryEnhancer) classes[i]
+				.newInstance();
+		    } catch (Throwable t) {
+			    throw new GeneralException(t);
+		    }
+		}
+    	return _auxEnhancers;	
+    }
+    
+    /**
      * Allow any registered auxiliary code generators to run.
      */
     private void runAuxiliaryEnhancers() {
-	if (_auxEnhancers == null) {
-	    try {
-		Class[] classes = Services
-		    .getImplementorClasses(AuxiliaryEnhancer.class);
-		_auxEnhancers = new AuxiliaryEnhancer[classes.length];
-		for (int i = 0; i < _auxEnhancers.length; i++)
-		    _auxEnhancers[i] = (AuxiliaryEnhancer) classes[i]
-			.newInstance();
-	    } catch (Throwable t) {
-		throw new GeneralException(t);
-	    }
-	}
-	for (int i = 0; i < _auxEnhancers.length; i++)
-	    _auxEnhancers[i].run(_pc, _meta);
+    	AuxiliaryEnhancer[] auxEnhancers = getAuxiliaryEnhancers();
+    	for (int i = 0; i < auxEnhancers.length; i++)
+    		auxEnhancers[i].run(_pc, _meta);
+    }
+    
+    private Set getUnenhancedMethods() {
+    	Set result = new HashSet();
+    	AuxiliaryEnhancer[] auxEnhancers = getAuxiliaryEnhancers();
+    	for (int i = 0; i < auxEnhancers.length; i++) {
+    		Set contrib = auxEnhancers[i].getUnenhancedMethods();
+    		if (contrib != null || !contrib.isEmpty()) {
+    			result.addAll(contrib);
+     		}
+     	}
+    	return result;
     }
 
     /**
@@ -3485,5 +3509,6 @@
 	public static interface AuxiliaryEnhancer
 	{
 		public void run (BCClass bc, ClassMetaData meta);
+		public Set getUnenhancedMethods();
 	}
 }