Author: ppoddar
Date: Sat Oct 29 01:04:52 2011
New Revision: 1190723
URL: http://svn.apache.org/viewvc?rev=1190723&view=rev
Log:
OPENJPA-2065: allow interface as result class
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ResultPacker.java
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ResultPacker.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ResultPacker.java?rev=1190723&r1=1190722&r2=1190723&view=diff
==============================================================================
---
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ResultPacker.java
(original)
+++
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ResultPacker.java
Sat Oct 29 01:04:52 2011
@@ -117,10 +117,9 @@ public class ResultPacker {
/**
* Internal constructor.
*/
- private ResultPacker(Class candidate, Class[] types, String[] aliases,
- Class resultClass) {
+ private ResultPacker(Class<?> candidate, Class<?>[] types, String[]
aliases, Class<?> resultClass) {
_aliases = aliases;
- if (candidate == resultClass
+ if (candidate == resultClass || isInterface(resultClass, candidate)
||(types != null && types.length == 1 && types[0] == resultClass)
|| resultClass.isArray()) {
_resultClass = resultClass;
@@ -135,7 +134,7 @@ public class ResultPacker {
_constructor = null;
} else if (!_stdTypes.contains(_resultClass = resultClass)) {
// check for a constructor that matches the projection types
- Constructor cons = null;
+ Constructor<?> cons = null;
if (types != null && types.length > 0) {
try {
cons = _resultClass.getConstructor(types);
@@ -150,7 +149,7 @@ public class ResultPacker {
_put = findPut(methods);
_sets = new Member[aliases.length];
- Class type;
+ Class<?> type;
for (int i = 0; i < _sets.length; i++) {
type = (types == null) ? candidate : types[i];
_sets[i] = findSet(aliases[i], type, fields, methods);
@@ -172,6 +171,15 @@ public class ResultPacker {
_constructor = null;
}
}
+
+ boolean isInterface(Class<?> intf, Class<?> actual) {
+ Class<?>[] intfs = actual.getInterfaces();
+ for (Class<?> c : intfs) {
+ if (c == intf)
+ return true;
+ }
+ return false;
+ }
/**
* Ensure that conversion is possible.