You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2013/02/09 23:16:38 UTC
svn commit: r1444455 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/event/ main/java/org/apache/webbeans/portable/
main/java/org/apache/webbeans/proxy/
test/java/org/apache/webbeans/newtests/interceptors/factory/beans/
Author: struberg
Date: Sat Feb 9 22:16:38 2013
New Revision: 1444455
URL: http://svn.apache.org/r1444455
Log:
OWB-344 continue with proxying support for protected methods
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/ClassInterceptedClass.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java?rev=1444455&r1=1444454&r2=1444455&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java Sat Feb 9 22:16:38 2013
@@ -291,7 +291,7 @@ public class ObserverMethodImpl<T> imple
// since private methods cannot be intercepted, we have to unwrap anny possible proxy
if (object instanceof OwbNormalScopeProxy)
{
- object = getWebBeansContext().getInterceptorDecoratorProxyFactory().getInternalInstance(object);
+ object = getWebBeansContext().getInterceptorDecoratorProxyFactory().unwrapInstance(object);
}
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java?rev=1444455&r1=1444454&r2=1444455&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java Sat Feb 9 22:16:38 2013
@@ -167,7 +167,7 @@ public class InjectionTargetImpl<T> exte
{
if (probableProxyInstance instanceof OwbInterceptorProxy)
{
- return webBeansContext.getInterceptorDecoratorProxyFactory().getInternalInstance(probableProxyInstance);
+ return webBeansContext.getInterceptorDecoratorProxyFactory().unwrapInstance(probableProxyInstance);
}
return probableProxyInstance;
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java?rev=1444455&r1=1444454&r2=1444455&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java Sat Feb 9 22:16:38 2013
@@ -274,7 +274,7 @@ public abstract class AbstractProxyFacto
int modifiers = delegatedMethod.getModifiers();
//X TODO how to deal with native functions?
- return (modifiers & (Modifier.PRIVATE | Modifier.PROTECTED | Modifier.STATIC | Modifier.FINAL | Modifier.NATIVE)) > 0 ||
+ return (modifiers & (Modifier.PRIVATE | Modifier.STATIC | Modifier.FINAL | Modifier.NATIVE)) > 0 ||
"finalize".equals(delegatedMethod.getName());
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java?rev=1444455&r1=1444454&r2=1444455&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java Sat Feb 9 22:16:38 2013
@@ -102,13 +102,20 @@ public class InterceptorDecoratorProxyFa
/**
* @return the internal instance which gets proxied.
*/
- public <T> T getInternalInstance(T proxyInstance)
+ public static <T> T unwrapInstance(T proxyInstance)
{
try
{
- Field internalInstanceField = proxyInstance.getClass().getDeclaredField(FIELD_PROXIED_INSTANCE);
- internalInstanceField.setAccessible(true);
- return (T) internalInstanceField.get(proxyInstance);
+ if (proxyInstance instanceof OwbInterceptorProxy)
+ {
+ Field internalInstanceField = proxyInstance.getClass().getDeclaredField(FIELD_PROXIED_INSTANCE);
+ internalInstanceField.setAccessible(true);
+ return (T) internalInstanceField.get(proxyInstance);
+ }
+ else
+ {
+ return proxyInstance;
+ }
}
catch (Exception e)
{
@@ -143,7 +150,7 @@ public class InterceptorDecoratorProxyFa
* <ol>
* <li>
* private methods - they do not get proxied at all! If you like to invoke a private method,
- * then you can use {@link #getInternalInstance(Object)} and use reflection on it.
+ * then you can use {@link #unwrapInstance(Object)} and use reflection on it.
* </li>
* <li>
* non-proxied methods - all methods which do not have a business interceptor nor decorator
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java?rev=1444455&r1=1444454&r2=1444455&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java Sat Feb 9 22:16:38 2013
@@ -27,6 +27,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@@ -52,6 +53,9 @@ public class NormalScopeProxyFactory ext
/** the name of the field which stores the {@link Provider} for the Contextual Instance */
public static final String FIELD_INSTANCE_PROVIDER = "owbContextualInstanceProvider";
+ /** the Method[] for all protected methods. We need to invoke them via reflection. */
+ public static final String FIELD_PROTECTED_METHODS = "owbProtectedMethods";
+
/**
* Caches the proxy classes for each bean.
* We need this to prevent filling up the ClassLoaders by
@@ -70,6 +74,27 @@ public class NormalScopeProxyFactory ext
return OwbNormalScopeProxy.class;
}
+
+ public static <T> T unwrapInstance(T proxyInstance)
+ {
+ if (proxyInstance instanceof OwbNormalScopeProxy)
+ {
+ try
+ {
+ Field internalInstanceField = proxyInstance.getClass().getDeclaredField(FIELD_INSTANCE_PROVIDER);
+ internalInstanceField.setAccessible(true);
+ Provider<T> provider = (Provider<T>) internalInstanceField.get(proxyInstance);
+ return provider.get();
+ }
+ catch (Exception e)
+ {
+ ExceptionUtil.throwAsRuntimeException(e);
+ }
+ }
+
+ return proxyInstance;
+ }
+
/**
* @return the internal instance which gets proxied.
*/
@@ -196,18 +221,52 @@ public class NormalScopeProxyFactory ext
String proxyClassName = getUnusedProxyClassName(classLoader, classToProxy.getName() + "$OwbNormalScopeProxy");
Method[] nonInterceptedMethods;
+ Method[] interceptedMethods = null;
if (classToProxy.isInterface())
{
nonInterceptedMethods = classToProxy.getMethods();
}
else
{
- List<Method> methods = ClassUtil.getNonPrivateMethods(classToProxy, true);
+ List<Method> methods = new ArrayList<Method>();
+ List<Method> protectedMethods = new ArrayList<Method>();
+
+
+ for (Method method : ClassUtil.getNonPrivateMethods(classToProxy, true))
+ {
+ if (unproxyableMethod(method))
+ {
+ continue;
+ }
+ if (Modifier.isProtected(method.getModifiers()))
+ {
+ protectedMethods.add(method);
+ }
+ else
+ {
+ methods.add(method);
+ }
+ }
+
nonInterceptedMethods = methods.toArray(new Method[methods.size()]);
+ interceptedMethods = protectedMethods.toArray(new Method[protectedMethods.size()]);
}
- Class<T> clazz = createProxyClass(classLoader, proxyClassName, classToProxy, null, nonInterceptedMethods);
+ Class<T> clazz = createProxyClass(classLoader, proxyClassName, classToProxy, interceptedMethods, nonInterceptedMethods);
+ if (interceptedMethods != null && interceptedMethods.length > 0)
+ {
+ try
+ {
+ Field protectedMethodsField = clazz.getDeclaredField(FIELD_PROTECTED_METHODS);
+ protectedMethodsField.setAccessible(true);
+ protectedMethodsField.set(null, interceptedMethods);
+ }
+ catch (Exception e)
+ {
+ throw new ProxyGenerationException(e);
+ }
+ }
return clazz;
}
@@ -255,6 +314,7 @@ public class NormalScopeProxyFactory ext
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, parentClassFileName, "<init>", descriptor);
+ // the instance provider field
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitInsn(Opcodes.ACONST_NULL);
mv.visitFieldInsn(Opcodes.PUTFIELD, proxyClassFileName, FIELD_INSTANCE_PROVIDER, Type.getDescriptor(Provider.class));
@@ -275,14 +335,22 @@ public class NormalScopeProxyFactory ext
// variable #1, the Provider<?> for the Contextual Instance
cw.visitField(Opcodes.ACC_PRIVATE,
FIELD_INSTANCE_PROVIDER, Type.getDescriptor(Provider.class), null, null).visitEnd();
+
+ // variable #2, the Method[] for all protected methods
+ cw.visitField(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC,
+ FIELD_PROTECTED_METHODS, Type.getDescriptor(Method[].class), null, null).visitEnd();
}
+ /**
+ * In the NormalScope proxying case this is used for all the protected methods
+ * as they need to get invoked via reflection.
+ */
@Override
protected void delegateInterceptedMethods(ClassLoader classLoader, ClassWriter cw, String proxyClassFileName,
Class<?> classToProxy, Method[] interceptedMethods)
throws ProxyGenerationException
{
- // nothing to do ;)
+ //X TODO invoke protected methods via reflection
}
@Override
@@ -290,13 +358,9 @@ public class NormalScopeProxyFactory ext
Class<?> classToProxy, Method[] noninterceptedMethods)
throws ProxyGenerationException
{
+
for (Method delegatedMethod : noninterceptedMethods)
{
- if (unproxyableMethod(delegatedMethod))
- {
- continue;
- }
-
String methodDescriptor = Type.getMethodDescriptor(delegatedMethod);
//X TODO handle generic exception types?
@@ -346,6 +410,8 @@ public class NormalScopeProxyFactory ext
mv.visitEnd();
}
+
}
+
}
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/ClassInterceptedClass.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/ClassInterceptedClass.java?rev=1444455&r1=1444454&r2=1444455&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/ClassInterceptedClass.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/ClassInterceptedClass.java Sat Feb 9 22:16:38 2013
@@ -91,9 +91,9 @@ public class ClassInterceptedClass
throw new NumberFormatException("should fit");
}
- protected void initConf()
+ protected int protectedMethod()
{
- //
+ return 21;
}
}