https://issues.apache.org/jira/browse/EXTSCRIPT-155 fixing a proxy issue with ext-val, fixing an issue with the dynamic class detection, some classes were loaded upfront with a different classloader which is a non issue, but needs to be taken into consideration
git-svn-id: https://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk@1300967 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/WeavingContext.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/WeavingContext.java
index 542e475..1dbbae7 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/WeavingContext.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/WeavingContext.java
@@ -25,6 +25,7 @@
import org.apache.myfaces.extensions.scripting.core.engine.api.ClassScanner;
import org.apache.myfaces.extensions.scripting.core.engine.api.CompilationResult;
import org.apache.myfaces.extensions.scripting.core.engine.api.ScriptingEngine;
+import org.apache.myfaces.extensions.scripting.core.engine.dependencyScan.loaders.ScannerClassloader;
import org.apache.myfaces.extensions.scripting.core.loader.ThrowAwayClassloader;
import org.apache.myfaces.extensions.scripting.core.monitor.ClassResource;
import org.apache.myfaces.extensions.scripting.core.monitor.WatchedResource;
@@ -350,7 +351,8 @@
public boolean isDynamic(Class clazz)
{
- return clazz.getClassLoader() instanceof ThrowAwayClassloader;
+ return ((clazz.getClassLoader() instanceof ThrowAwayClassloader) || (clazz.getClassLoader() instanceof
+ ScannerClassloader));
}
/**
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicDecorators/implementations/RenderkitProxy.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicDecorators/implementations/RenderkitProxy.java
index 5dc25e6..494df5d 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicDecorators/implementations/RenderkitProxy.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicDecorators/implementations/RenderkitProxy.java
@@ -18,7 +18,6 @@
*/
package org.apache.myfaces.extensions.scripting.jsf.dynamicDecorators.implementations;
-
import org.apache.myfaces.extensions.scripting.core.api.Decorated;
import org.apache.myfaces.extensions.scripting.core.api.ScriptingConst;
import org.apache.myfaces.extensions.scripting.core.api.WeavingContext;
@@ -31,6 +30,7 @@
import javax.faces.render.ResponseStateManager;
import java.io.OutputStream;
import java.io.Writer;
+import java.lang.reflect.Field;
import java.util.Iterator;
/**
@@ -40,16 +40,18 @@
*
* @author Werner Punz
*/
-public class RenderkitProxy extends RenderKit implements Decorated
+public class RenderkitProxy extends RenderKit implements Decorated
{
RenderKit _delegate = null;
- public RenderkitProxy(RenderKit delegate) {
+ public RenderkitProxy(RenderKit delegate)
+ {
_delegate = delegate;
}
- public void addRenderer(String componentFamily, String rendererType, Renderer renderer) {
+ public void addRenderer(String componentFamily, String rendererType, Renderer renderer)
+ {
weaveDelegate();
//wo do it brute force here because we have sometimes casts and hence cannot rely on proxies
//renderers itself are flyweight patterns which means they are shared over objects
@@ -59,23 +61,100 @@
_delegate.addRenderer(componentFamily, rendererType, renderer);
}
- public Renderer getRenderer(String componentFamily, String rendererType) {
+ /**
+ * unproxy renderer from different systems
+ *
+ * @return
+ */
+ private Renderer unproxy(Renderer proxiedObject)
+ {
+ Renderer oldProxiedObject = proxiedObject;
+ try
+ {
+ //extval
+
+ String name = proxiedObject.getClass().getName();
+ while (name.contains("ExtVal") && (name.contains("Wrapper") || name.contains("Proxy")))
+ {
+ Field proxiedField = proxiedObject.getClass().getDeclaredField("wrapped");
+ proxiedField.setAccessible(true);
+ proxiedObject = (Renderer) proxiedField.get(proxiedObject);
+
+ name = proxiedObject.getClass().getName();
+ }
+
+ // "getWrapped");
+ }
+ catch (IllegalAccessException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ catch (NoSuchFieldException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File
+ // Templates.
+ }
+ return proxiedObject;
+ }
+
+ private Renderer proxy(Renderer proxy, Renderer toBeProxied)
+ {
+ Renderer oldProxiedObject = proxy;
+ try
+ {
+ //extval
+
+ String name = proxy.getClass().getName();
+ while (name.contains("ExtVal") && (name.contains("Wrapper") || name.contains("Proxy")))
+ {
+ Field proxiedField = proxy.getClass().getDeclaredField("wrapped");
+ proxiedField.setAccessible(true);
+ oldProxiedObject = proxy;
+ proxy = (Renderer) proxiedField.get(proxy);
+ name = proxy.getClass().getName();
+ if(!name.contains("ExtVal") && !(name.contains("Wrapper") || name.contains("Proxy"))) {
+ proxiedField.set(oldProxiedObject, proxy);
+ return proxy;
+ }
+
+ }
+ }
+ catch (IllegalAccessException e)
+ {
+ e.printStackTrace();
+ }
+ catch (NoSuchFieldException e)
+ {
+ e.printStackTrace();
+ }
+ return toBeProxied;
+ }
+ public Renderer getRenderer(String componentFamily, String rendererType)
+ {
weaveDelegate();
Renderer rendr = _delegate.getRenderer(componentFamily, rendererType);
- Renderer rendr2 = (Renderer) reloadInstance(rendr, ScriptingConst.ARTIFACT_TYPE_RENDERER);
- if (rendr != rendr2) {
+ Renderer unproxiedRendr = unproxy(rendr);
+ if(unproxiedRendr.getClass().getName().contains("JavaTestRenderer1")) {
+ System.out.println("Debugpoint found");
+ }
+ //TODO extval proxy handling here
+ Renderer rendr2 = (Renderer) reloadInstance(unproxiedRendr, ScriptingConst.ARTIFACT_TYPE_RENDERER);
+ if (unproxiedRendr != rendr2)
+ {
Renderer tempRenderer = _delegate.getRenderer(componentFamily, rendererType);
/**<></>if (tempRenderer instanceof PurgedRenderer) {
- return handleAnnotationChange(componentFamily, rendererType);
- } */
-
+ return handleAnnotationChange(componentFamily, rendererType);
+ } */
+ //in case of a renderer proxy we have to weave the original object back in
+ rendr2 = proxy(rendr ,rendr2);
_delegate.addRenderer(componentFamily, rendererType, rendr2);
return rendr2;
}
return rendr;
}
- private ClientBehaviorRenderer handleAnnotationChangeBehaviorRenderer(String s) {
+ private ClientBehaviorRenderer handleAnnotationChangeBehaviorRenderer(String s)
+ {
ClientBehaviorRenderer rendr2;
rendr2 = _delegate.getClientBehaviorRenderer(s);
@@ -86,7 +165,8 @@
return rendr2;
}
- private Renderer handleAnnotationChange(String s, String s1) {
+ private Renderer handleAnnotationChange(String s, String s1)
+ {
Renderer rendr2;
//WeavingContext.getWeaver().fullClassScan();
@@ -98,23 +178,27 @@
return rendr2;
}
- public ResponseStateManager getResponseStateManager() {
+ public ResponseStateManager getResponseStateManager()
+ {
weaveDelegate();
return _delegate.getResponseStateManager();
}
- public ResponseWriter createResponseWriter(Writer writer, String s, String s1) {
+ public ResponseWriter createResponseWriter(Writer writer, String s, String s1)
+ {
weaveDelegate();
return (ResponseWriter) reloadInstance(_delegate.createResponseWriter(writer, s, s1), ScriptingConst.ARTIFACT_TYPE_RESPONSEWRITER);
}
- public ResponseStream createResponseStream(OutputStream outputStream) {
+ public ResponseStream createResponseStream(OutputStream outputStream)
+ {
weaveDelegate();
return (ResponseStream) reloadInstance(_delegate.createResponseStream(outputStream), ScriptingConst.ARTIFACT_TYPE_RESPONSESTREAM);
}
@Override
- public void addClientBehaviorRenderer(String s, ClientBehaviorRenderer renderer) {
+ public void addClientBehaviorRenderer(String s, ClientBehaviorRenderer renderer)
+ {
weaveDelegate();
renderer = (ClientBehaviorRenderer) reloadInstance(renderer, ScriptingConst.ARTIFACT_TYPE_CLIENTBEHAVIORRENDERER);
@@ -122,11 +206,13 @@
}
@Override
- public ClientBehaviorRenderer getClientBehaviorRenderer(String s) {
+ public ClientBehaviorRenderer getClientBehaviorRenderer(String s)
+ {
weaveDelegate();
ClientBehaviorRenderer rendr = _delegate.getClientBehaviorRenderer(s);
ClientBehaviorRenderer rendr2 = (ClientBehaviorRenderer) reloadInstance(rendr, ScriptingConst.ARTIFACT_TYPE_CLIENTBEHAVIORRENDERER);
- if (rendr != rendr2) {
+ if (rendr != rendr2)
+ {
rendr2 = _delegate.getClientBehaviorRenderer(s);
/*<>if (rendr2 instanceof PurgedClientBehaviorRenderer) {
@@ -138,36 +224,44 @@
}
@Override
- public Iterator<String> getClientBehaviorRendererTypes() {
+ public Iterator<String> getClientBehaviorRendererTypes()
+ {
weaveDelegate();
return _delegate.getClientBehaviorRendererTypes();
}
@Override
- public Iterator<String> getComponentFamilies() {
+ public Iterator<String> getComponentFamilies()
+ {
weaveDelegate();
return _delegate.getComponentFamilies();
}
@Override
- public Iterator<String> getRendererTypes(String s) {
+ public Iterator<String> getRendererTypes(String s)
+ {
weaveDelegate();
return _delegate.getRendererTypes(s);
}
- public Object getDelegate() {
+ public Object getDelegate()
+ {
return _delegate;
}
- private void weaveDelegate() {
+ private void weaveDelegate()
+ {
_delegate = (RenderKit) WeavingContext.getInstance().reload(_delegate, ScriptingConst.ARTIFACT_TYPE_RENDERKIT);
}
- private Object reloadInstance(Object instance, int artefactType) {
- if (instance == null) {
+ private Object reloadInstance(Object instance, int artefactType)
+ {
+ if (instance == null)
+ {
return null;
}
- if (WeavingContext.getInstance().isDynamic(instance.getClass()) ) {
+ if (WeavingContext.getInstance().isDynamic(instance.getClass()))
+ {
instance = WeavingContext.getInstance().reload(instance, artefactType);
//now the add should be done properly if possible
}
diff --git a/extscript-examples/myfaces20-example/pom.xml b/extscript-examples/myfaces20-example/pom.xml
index 772b4f0..ba2275e 100644
--- a/extscript-examples/myfaces20-example/pom.xml
+++ b/extscript-examples/myfaces20-example/pom.xml
@@ -113,33 +113,31 @@
and/or MyFaces ext-val
-->
-
<dependency>
<groupId>org.apache.myfaces.extensions.validator</groupId>
<artifactId>myfaces-extval-core</artifactId>
<version>${extval.version}</version>
</dependency>
-
- <!--
+ <!--
<dependency>
<groupId>org.apache.myfaces.extensions.validator.validation-modules</groupId>
<artifactId>myfaces-extval-property-validation</artifactId>
<version>${extval.version}</version>
</dependency>
-->
-
<dependency>
<groupId>org.apache.myfaces.extensions.validator.validation-modules</groupId>
<artifactId>myfaces-extval-bean-validation</artifactId>
<version>${extval.version}</version>
</dependency>
-
+
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.0.0.GA</version>
</dependency>
+
<!-- Hibernate annotations needs sl4j as dependency -->
<dependency>
<groupId>org.slf4j</groupId>
diff --git a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy
index aa8e8ac..97f1d9d 100644
--- a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy
+++ b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy
@@ -26,7 +26,6 @@
@ManagedBean(name = "blogService")
@ApplicationScoped
-
public class BlogService {
List blogEntries = new ArrayList()
@@ -36,7 +35,7 @@
public void addEntry2(BlogEntry entry) {
Logger log = Logger.getLogger(BlogService.class.getName())
- log.info("Adding entry 2, topic: " + entry.topic)
+ log.info("Adding entry 2, topic:" + entry.topic)
blogEntries.add(entry)
diff --git a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService2.groovy b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService2.groovy
index 4b24b3d..f1d7920 100644
--- a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService2.groovy
+++ b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService2.groovy
@@ -22,6 +22,8 @@
import javax.faces.bean.ManagedBean
import javax.faces.bean.ApplicationScoped
+
+
public class BlogService2 {
List blogEntries = new ArrayList()
@@ -32,7 +34,7 @@
public void addEntry(def entry) {
Logger log = Logger.getLogger(BlogService.class.getName())
- log.info("Adding entry, topic xxx: " + entry.topic)
+ log.info("------Adding entry, topic: " + entry.topic)
entry.topic = "topic from blogservice 2"
blogEntries.add(entry)
diff --git a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestRenderer.groovy b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestRenderer.groovy
index 7240f01..f47adcb 100644
--- a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestRenderer.groovy
+++ b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestRenderer.groovy
@@ -36,9 +36,9 @@
facesContext.responseWriter.write """
- <h1>Hello from a groovy JSF components renderer </h1>
+ <h1>Hello from a groovy JSF components renderer</h1>
- <p> you can find my sources under WEB-INF/groovy/... </p>
+ <p> you can find my sources under WEB-INF/groovy/...</p>
<p> you can edit the artefacts is running</p>
<p> I will pick up the changes after you have hit the reload button </p>
diff --git a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestComponent.java b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestComponent.java
index 98f5d14..2254035 100644
--- a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestComponent.java
+++ b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestComponent.java
@@ -22,6 +22,7 @@
import javax.faces.component.UIInput;
import javax.faces.component.FacesComponent;
+import javax.faces.component.UIOutput;
/**
* @author Werner Punz (latest modification by $Author$)
@@ -34,7 +35,7 @@
*/
@FacesComponent("at.irian.JavaTestComponent")
-public class JavaTestComponent extends UIInput implements Markable {
+public class JavaTestComponent extends UIOutput implements Markable {
String _testAttr;
diff --git a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer1.java b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer1.java
index b88fbb3..01056d4 100644
--- a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer1.java
+++ b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer1.java
@@ -48,7 +48,7 @@
JavaTestComponent myComponent = (JavaTestComponent) component;
ResponseWriter writer = context.getResponseWriter();
- writer.write("<h3>Renderer Demo Java Renderer 1</h3>");
+ writer.write("<h3>Renderer Demo Java Renderer 1 aaa</h3>");
//uncomment for demo 1
test(myComponent, writer);
diff --git a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer2.java b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer2.java
index 53adbe7..59ba769 100644
--- a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer2.java
+++ b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer2.java
@@ -24,6 +24,7 @@
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
+import javax.faces.render.FacesRenderer;
import java.io.IOException;
/**
@@ -33,7 +34,6 @@
* This renderer can act as a drag and drop target for the annotation
* set in JavaTestRenderer1
*/
-
public class JavaTestRenderer2 extends HtmlTextareaRendererBase {
private static final String MSG = "<h2> Hello world ccc from Renderer 2 </h2>";