You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by we...@apache.org on 2012/03/15 14:06:22 UTC
svn commit: r1300967 - in /myfaces/extensions/scripting/trunk:
extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/
extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/j...
Author: werpu
Date: Thu Mar 15 13:06:21 2012
New Revision: 1300967
URL: http://svn.apache.org/viewvc?rev=1300967&view=rev
Log:
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
Modified:
myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/WeavingContext.java
myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicDecorators/implementations/RenderkitProxy.java
myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/pom.xml
myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy
myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService2.groovy
myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestRenderer.groovy
myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestComponent.java
myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer1.java
myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer2.java
Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/WeavingContext.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/WeavingContext.java?rev=1300967&r1=1300966&r2=1300967&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/WeavingContext.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/WeavingContext.java Thu Mar 15 13:06:21 2012
@@ -25,6 +25,7 @@ import org.apache.myfaces.extensions.scr
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 class WeavingContext
public boolean isDynamic(Class clazz)
{
- return clazz.getClassLoader() instanceof ThrowAwayClassloader;
+ return ((clazz.getClassLoader() instanceof ThrowAwayClassloader) || (clazz.getClassLoader() instanceof
+ ScannerClassloader));
}
/**
Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicDecorators/implementations/RenderkitProxy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicDecorators/implementations/RenderkitProxy.java?rev=1300967&r1=1300966&r2=1300967&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicDecorators/implementations/RenderkitProxy.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicDecorators/implementations/RenderkitProxy.java Thu Mar 15 13:06:21 2012
@@ -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.Renderer;
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 @@ import java.util.Iterator;
*
* @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 @@ public class RenderkitProxy extends R
_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 @@ public class RenderkitProxy extends R
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 @@ public class RenderkitProxy extends R
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 @@ public class RenderkitProxy extends R
}
@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 @@ public class RenderkitProxy extends R
}
@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
}
Modified: myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/pom.xml?rev=1300967&r1=1300966&r2=1300967&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/pom.xml (original)
+++ myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/pom.xml Thu Mar 15 13:06:21 2012
@@ -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>
Modified: myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy?rev=1300967&r1=1300966&r2=1300967&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy (original)
+++ myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy Thu Mar 15 13:06:21 2012
@@ -26,7 +26,6 @@ import javax.faces.bean.ManagedBean
@ManagedBean(name = "blogService")
@ApplicationScoped
-
public class BlogService {
List blogEntries = new ArrayList()
@@ -36,7 +35,7 @@ public class BlogService {
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)
Modified: myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService2.groovy
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService2.groovy?rev=1300967&r1=1300966&r2=1300967&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService2.groovy (original)
+++ myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService2.groovy Thu Mar 15 13:06:21 2012
@@ -22,6 +22,8 @@ import java.util.logging.Logger
import javax.faces.bean.ManagedBean
import javax.faces.bean.ApplicationScoped
+
+
public class BlogService2 {
List blogEntries = new ArrayList()
@@ -32,7 +34,7 @@ public class BlogService2 {
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)
Modified: myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestRenderer.groovy
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestRenderer.groovy?rev=1300967&r1=1300966&r2=1300967&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestRenderer.groovy (original)
+++ myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestRenderer.groovy Thu Mar 15 13:06:21 2012
@@ -36,9 +36,9 @@ public class TestRenderer extends HtmlTe
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>
Modified: myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestComponent.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestComponent.java?rev=1300967&r1=1300966&r2=1300967&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestComponent.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestComponent.java Thu Mar 15 13:06:21 2012
@@ -22,6 +22,7 @@ import org.apache.myfaces.javaloader.oth
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 @@ import javax.faces.component.FacesCompon
*/
@FacesComponent("at.irian.JavaTestComponent")
-public class JavaTestComponent extends UIInput implements Markable {
+public class JavaTestComponent extends UIOutput implements Markable {
String _testAttr;
Modified: myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer1.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer1.java?rev=1300967&r1=1300966&r2=1300967&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer1.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer1.java Thu Mar 15 13:06:21 2012
@@ -48,7 +48,7 @@ public class JavaTestRenderer1 extends H
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);
Modified: myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer2.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer2.java?rev=1300967&r1=1300966&r2=1300967&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer2.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/JavaTestRenderer2.java Thu Mar 15 13:06:21 2012
@@ -24,6 +24,7 @@ import org.apache.myfaces.extensions.scr
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 @@ import java.io.IOException;
* 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>";