Author: mprudhom
Date: Thu Sep 14 16:06:11 2006
New Revision: 443509
URL: http://svn.apache.org/viewvc?view=rev&rev=443509
Log:
Allow callback methods to accept the Entity subclass of the type they are
listening on, rather than forcing them to all take an argument of type
java.lang.Object (section 3.5.1)
Modified:
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/BeanLifecycleCallbacks.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/MethodLifecycleCallbacks.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InterfaceImplGenerator.java
incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/event/localizer.properties
incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
Modified:
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/BeanLifecycleCallbacks.java
URL:
http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/BeanLifecycleCallbacks.java?view=diff&rev=443509&r1=443508&r2=443509
==============================================================================
---
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/BeanLifecycleCallbacks.java
(original)
+++
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/BeanLifecycleCallbacks.java
Thu Sep 14 16:06:11 2006
@@ -38,9 +38,10 @@
*
* @arg whether another argunent is expected such as AfterDetach
*/
- public BeanLifecycleCallbacks(Class cls, String method, boolean arg) {
+ public BeanLifecycleCallbacks(Class cls, String method, boolean arg,
+ Class type) {
this(cls, getMethod(cls, method, arg ? new Class[]{ Object.class,
- Object.class } : new Class[]{ Object.class }), arg);
+ type } : new Class[]{ type }), arg);
}
/**
Modified:
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/MethodLifecycleCallbacks.java
URL:
http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/MethodLifecycleCallbacks.java?view=diff&rev=443509&r1=443508&r2=443509
==============================================================================
---
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/MethodLifecycleCallbacks.java
(original)
+++
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/MethodLifecycleCallbacks.java
Thu Sep 14 16:06:11 2006
@@ -16,6 +16,7 @@
package org.apache.openjpa.event;
import java.lang.reflect.Method;
+import java.util.Arrays;
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.util.UserException;
@@ -92,7 +93,14 @@
*/
protected static Method getMethod(Class cls, String method, Class[] args) {
try {
- return cls.getMethod(method, args);
+ Method[] methods = cls.getMethods();
+ for (int i = 0; i < methods.length; i++) {
+ if (!method.equals(methods[i].getName()))
+ continue;
+
+ if (isAssignable(methods[i].getParameterTypes(), args))
+ return methods[i];
+ }
} catch (Throwable t) {
try {
// try again with the declared methods, which will
@@ -103,8 +111,32 @@
return m;
} catch (Throwable t2) {
throw new UserException(_loc.get("method-notfound",
- cls.getName(), method), t);
+ cls.getName(), method,
+ args == null ? null : Arrays.asList(args)), t);
}
}
+
+ throw new UserException(_loc.get("method-notfound",
+ cls.getName(), method,
+ args == null ? null : Arrays.asList(args)));
}
+
+ /**
+ * Returns true if all parameters in the from array are assignable
+ * from the corresponding parameters of the to array.
+ */
+ private static boolean isAssignable(Class[] from, Class[] to) {
+ if (from == null)
+ return to == null;
+
+ if (from.length != to.length)
+ return false;
+
+ for (int i = 0; i < from.length; i++) {
+ if (from[i] == null || !from[i].isAssignableFrom(to[i]))
+ return false;
+ }
+
+ return true;
+ }
}
Modified:
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InterfaceImplGenerator.java
URL:
http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InterfaceImplGenerator.java?view=diff&rev=443509&r1=443508&r2=443509
==============================================================================
---
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InterfaceImplGenerator.java
(original)
+++
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InterfaceImplGenerator.java
Thu Sep 14 16:06:11 2006
@@ -205,7 +205,7 @@
return true;
try {
Method meth = iface.getDeclaredMethod("is" + StringUtils.capitalize
- (fmd.getName()), null);
+ (fmd.getName()), (Class[]) null);
return meth == null;
} catch (NoSuchMethodException e) {}
return true;
Modified:
incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/event/localizer.properties
URL:
http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/event/localizer.properties?view=diff&rev=443509&r1=443508&r2=443509
==============================================================================
---
incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/event/localizer.properties
(original)
+++
incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/event/localizer.properties
Thu Sep 14 16:06:11 2006
@@ -75,4 +75,5 @@
tcp-wrong-version-error: Received packet from "{0}" with invalid version \
number. Check if a prior release of OpenJPA is being used on this host.
bean-constructor: Could not instantiate class {0}.
-method-notfound: Method "{1}" not found in class "{0}".
+method-notfound: Method "{1}" with arguments of type: {2} \
+ not found in class "{0}".
Modified:
incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
URL:
http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java?view=diff&rev=443509&r1=443508&r2=443509
==============================================================================
---
incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
(original)
+++
incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
Thu Sep 14 16:06:11 2006
@@ -1528,6 +1528,11 @@
return false;
boolean system = currentElement() == null;
+ Class type = currentElement() == null ? null :
+ ((ClassMetaData) currentElement()).getDescribedType();
+ if (type == null)
+ type = Object.class;
+
if (_callbacks == null) {
_callbacks = (Collection<LifecycleCallbacks>[])
new Collection[LifecycleEvent.ALL_EVENTS.length];
@@ -1538,7 +1543,7 @@
LifecycleCallbacks adapter;
if (_listener != null)
adapter = new BeanLifecycleCallbacks(_listener,
- attrs.getValue("method-name"), false);
+ attrs.getValue("method-name"), false, type);
else
adapter = new MethodLifecycleCallbacks(_cls,
attrs.getValue("method-name"), false);