You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2008/11/20 22:19:19 UTC

svn commit: r719377 - in /myfaces/extensions/validator/branches/jsf_1.1: component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/renderkit/ component-support/trinidad-support/src/main/java/org/apache/myfaces/ex...

Author: gpetracek
Date: Thu Nov 20 13:19:19 2008
New Revision: 719377

URL: http://svn.apache.org/viewvc?rev=719377&view=rev
Log:
support for trinidad table renderer

Added:
    myfaces/extensions/validator/branches/jsf_1.1/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/renderkit/ExtValTrinidadRendererProxy.java
    myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValLazyRendererProxy.java
Modified:
    myfaces/extensions/validator/branches/jsf_1.1/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/startup/TrinidadModuleStartupListener.java
    myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererProxy.java
    myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererWrapper.java
    myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java

Added: myfaces/extensions/validator/branches/jsf_1.1/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/renderkit/ExtValTrinidadRendererProxy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/jsf_1.1/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/renderkit/ExtValTrinidadRendererProxy.java?rev=719377&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/jsf_1.1/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/renderkit/ExtValTrinidadRendererProxy.java (added)
+++ myfaces/extensions/validator/branches/jsf_1.1/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/renderkit/ExtValTrinidadRendererProxy.java Thu Nov 20 13:19:19 2008
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.validator.trinidad.renderkit;
+
+import org.apache.myfaces.extensions.validator.core.renderkit.ExtValRendererProxy;
+import org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.table.TableRenderingContext;
+
+import javax.faces.component.UIComponent;
+import javax.faces.render.Renderer;
+import javax.faces.context.FacesContext;
+
+/**
+ * solution for trinidad table renderer issue (in connection with double call prevention proxies)
+ * 
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+public class ExtValTrinidadRendererProxy extends ExtValRendererProxy
+{
+    public ExtValTrinidadRendererProxy(Renderer renderer)
+    {
+        super(renderer);
+    }
+
+    @Override
+    protected String getOptionalKey(FacesContext facesContext, UIComponent uiComponent)
+    {
+        if(TableRenderingContext.getCurrentInstance() != null)
+        {
+            return "|" + TableRenderingContext.getCurrentInstance().getRenderStage().getStage();
+        }
+
+        return "";
+    }
+}

Modified: myfaces/extensions/validator/branches/jsf_1.1/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/startup/TrinidadModuleStartupListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/jsf_1.1/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/startup/TrinidadModuleStartupListener.java?rev=719377&r1=719376&r2=719377&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/jsf_1.1/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/startup/TrinidadModuleStartupListener.java (original)
+++ myfaces/extensions/validator/branches/jsf_1.1/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/startup/TrinidadModuleStartupListener.java Thu Nov 20 13:19:19 2008
@@ -21,9 +21,11 @@
 import org.apache.myfaces.extensions.validator.core.startup.AbstractStartupListener;
 import org.apache.myfaces.extensions.validator.core.ExtValContext;
 import org.apache.myfaces.extensions.validator.core.renderkit.AbstractRenderKitWrapperFactory;
+import org.apache.myfaces.extensions.validator.core.renderkit.ExtValRendererProxy;
 import org.apache.myfaces.extensions.validator.core.factory.FactoryNames;
 import org.apache.myfaces.extensions.validator.trinidad.initializer.component.TrinidadComponentInitializer;
 import org.apache.myfaces.extensions.validator.trinidad.WebXmlParameter;
+import org.apache.myfaces.extensions.validator.trinidad.renderkit.ExtValTrinidadRendererProxy;
 import org.apache.myfaces.extensions.validator.trinidad.interceptor.TrinidadValidationExceptionInterceptor;
 import org.apache.myfaces.extensions.validator.internal.Priority;
 import org.apache.myfaces.extensions.validator.internal.ToDo;
@@ -66,5 +68,16 @@
         {
             ExtValContext.getContext().addValidationExceptionInterceptor(new TrinidadValidationExceptionInterceptor());
         }
+
+        //deactivate extval renderer proxy - due to an incompatibility with the table renderer
+        ExtValContext.getContext()
+                .addGlobalProperty(ExtValRendererProxy.KEY, ExtValTrinidadRendererProxy.class.getName());
+
+        /*
+         * if there are further incompatible renderers use the following quick-fix:
+         *         ExtValContext.getContext()
+                .addGlobalProperty(ExtValRendererProxy.KEY, null);
+           attention: it causes direct delegation without a check of double invocations
+         */
     }
 }

Added: myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValLazyRendererProxy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValLazyRendererProxy.java?rev=719377&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValLazyRendererProxy.java (added)
+++ myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValLazyRendererProxy.java Thu Nov 20 13:19:19 2008
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.validator.core.renderkit;
+
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.core.ExtValContext;
+import org.apache.myfaces.extensions.validator.util.ClassUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.faces.context.FacesContext;
+import javax.faces.render.Renderer;
+import javax.faces.component.UIComponent;
+import javax.faces.convert.ConverterException;
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+
+/**
+ * to support a custom proxy
+ *
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+class ExtValLazyRendererProxy extends Renderer
+{
+    protected final Log logger = LogFactory.getLog(getClass());
+
+    private Renderer wrapped;
+
+    public ExtValLazyRendererProxy(Renderer renderer)
+    {
+        this.wrapped = renderer;
+
+        if(logger.isTraceEnabled())
+        {
+            logger.trace("simple proxy created for " + renderer.getClass().getName());
+        }
+    }
+
+    @Override
+    public void decode(FacesContext facesContext, UIComponent uiComponent)
+    {
+        getLazyRenderer().decode(facesContext, uiComponent);
+    }
+
+    @Override
+    public void encodeBegin(FacesContext facesContext, UIComponent uiComponent)
+        throws IOException
+    {
+        getLazyRenderer().encodeBegin(facesContext, uiComponent);
+    }
+
+    @Override
+    public void encodeChildren(FacesContext facesContext, UIComponent uiComponent)
+        throws IOException
+    {
+        getLazyRenderer().encodeChildren(facesContext, uiComponent);
+    }
+
+    @Override
+    public void encodeEnd(FacesContext facesContext, UIComponent uiComponent)
+        throws IOException
+    {
+        getLazyRenderer().encodeEnd(facesContext, uiComponent);
+    }
+
+    @Override
+    public String convertClientId(FacesContext facesContext, String s)
+    {
+        return getLazyRenderer().convertClientId(facesContext, s);
+    }
+
+    @Override
+    public boolean getRendersChildren()
+    {
+        return getLazyRenderer().getRendersChildren();
+    }
+
+    @Override
+    public Object getConvertedValue(FacesContext facesContext, UIComponent uiComponent, Object o)
+        throws ConverterException
+    {
+        return getLazyRenderer().getConvertedValue(facesContext, uiComponent, o);
+    }
+
+    private Renderer getLazyRenderer()
+    {
+        String proxyClassName = (String) ExtValContext.getContext().getGlobalProperty(ExtValRendererProxy.KEY);
+
+        if(proxyClassName != null && !proxyClassName.endsWith(getClass().getName()))
+        {
+            Class targetClass = ClassUtils.tryToLoadClassForName(proxyClassName);
+
+            if(targetClass == null)
+            {
+                throw new IllegalStateException("a custom invalid renderer proxy is configured: " + proxyClassName);
+            }
+
+            Class[] argClasses = new Class[1];
+            argClasses[0] = Renderer.class;
+
+            try
+            {
+                Constructor constructor = targetClass.getConstructor(argClasses);
+                return (Renderer)constructor.newInstance(this.wrapped);
+            }
+            catch (Throwable t)
+            {
+                if(logger.isWarnEnabled())
+                {
+                    logger.warn("couldn't create: " + targetClass.getName());
+                }
+
+                return this.wrapped;
+            }
+        }
+        else
+        {
+            return this.wrapped;
+        }
+    }
+
+}

Modified: myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererProxy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererProxy.java?rev=719377&r1=719376&r2=719377&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererProxy.java (original)
+++ myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererProxy.java Thu Nov 20 13:19:19 2008
@@ -40,9 +40,10 @@
 @UsageInformation(UsageCategory.INTERNAL)
 public class ExtValRendererProxy extends Renderer
 {
+    public static final String KEY = ExtValRendererProxy.class.getName() + ":KEY";
     protected final Log logger = LogFactory.getLog(getClass());
     
-    private Renderer wrapped;
+    protected Renderer wrapped;
 
     public ExtValRendererProxy(Renderer renderer)
     {
@@ -64,6 +65,13 @@
             entry.setDecodeCalled(true);
             wrapped.decode(facesContext, uiComponent);
         }
+        else
+        {
+            if(logger.isTraceEnabled())
+            {
+                logger.trace("double call of method 'decode' filtered");
+            }
+        }
     }
 
     @Override
@@ -77,6 +85,13 @@
             entry.setEncodeBeginCalled(true);
             wrapped.encodeBegin(facesContext, uiComponent);
         }
+        else
+        {
+            if(logger.isTraceEnabled())
+            {
+                logger.trace("double call of method 'encodeBegin' filtered");
+            }
+        }
     }
 
     @Override
@@ -90,6 +105,13 @@
             entry.setEncodeChildrenCalled(true);
             wrapped.encodeChildren(facesContext, uiComponent);
         }
+        else
+        {
+            if(logger.isTraceEnabled())
+            {
+                logger.trace("double call of method 'encodeChildren' filtered");
+            }
+        }
     }
 
     @Override
@@ -103,6 +125,13 @@
             entry.setEncodeEndCalled(true);
             wrapped.encodeEnd(facesContext, uiComponent);
         }
+        else
+        {
+            if(logger.isTraceEnabled())
+            {
+                logger.trace("double call of method 'encodeEnd' filtered");
+            }
+        }
     }
 
     @Override
@@ -127,18 +156,32 @@
         {
             entry.setConvertedValue(wrapped.getConvertedValue(facesContext, uiComponent, o));
         }
+        else
+        {
+            if(logger.isTraceEnabled())
+            {
+                logger.trace("double call of method 'getConvertedValue' filtered");
+            }
+        }
         return entry.getConvertedValue();
     }
 
     private RendererProxyEntry getOrInitEntry(FacesContext facesContext, UIComponent uiComponent)
     {
-        String clientId = uiComponent.getClientId(facesContext);
+        String key = uiComponent.getClientId(facesContext);
+
+        key += getOptionalKey(facesContext, uiComponent);
 
-        if (!getOrInitComponentProxyMapping().containsKey(clientId))
+        if (!getOrInitComponentProxyMapping().containsKey(key))
         {
-            getOrInitComponentProxyMapping().put(clientId, new RendererProxyEntry());
+            getOrInitComponentProxyMapping().put(key, new RendererProxyEntry());
         }
-        return getOrInitComponentProxyMapping().get(clientId);
+        return getOrInitComponentProxyMapping().get(key);
+    }
+
+    protected String getOptionalKey(FacesContext facesContext, UIComponent uiComponent)
+    {
+        return "";
     }
 
     private static final String PROXY_STORAGE_NAME = ExtValRendererProxy.class.getName() + ":STORAGE";

Modified: myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererWrapper.java?rev=719377&r1=719376&r2=719377&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererWrapper.java (original)
+++ myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererWrapper.java Thu Nov 20 13:19:19 2008
@@ -25,6 +25,7 @@
 import org.apache.myfaces.extensions.validator.core.renderkit.exception.SkipBeforeInterceptorsException;
 import org.apache.myfaces.extensions.validator.core.renderkit.exception.SkipAfterInterceptorsException;
 import org.apache.myfaces.extensions.validator.core.renderkit.exception.SkipRendererDelegationException;
+import org.apache.myfaces.extensions.validator.util.ClassUtils;
 import org.apache.commons.logging.LogFactory;
 import org.apache.commons.logging.Log;
 
@@ -33,6 +34,7 @@
 import javax.faces.convert.ConverterException;
 import javax.faces.render.Renderer;
 import java.io.IOException;
+import java.lang.reflect.Constructor;
 
 /**
  * Default approach to avoid proxies for converters and the adapter fallback.
@@ -57,7 +59,47 @@
 
     public ExtValRendererWrapper(Renderer renderer)
     {
-        this.wrapped = new ExtValRendererProxy(renderer);
+        String proxyClassName = (String)ExtValContext.getContext().getGlobalProperty(ExtValRendererProxy.KEY);
+
+        if(proxyClassName == null)
+        {
+            if(logger.isTraceEnabled())
+            {
+                logger.trace("no extval renderer proxy configured");
+            }
+
+            this.wrapped = new ExtValLazyRendererProxy(renderer);
+            return;
+        }
+
+        Class targetClass = ClassUtils.tryToLoadClassForName(proxyClassName);
+
+        if(targetClass == null)
+        {
+            if(logger.isTraceEnabled())
+            {
+                logger.trace("no extval renderer proxy configured");
+            }
+
+            this.wrapped = new ExtValLazyRendererProxy(renderer);
+            return;
+        }
+
+        Class[] argClasses = new Class[1];
+        argClasses[0] = Renderer.class;
+
+        try
+        {
+            Constructor constructor = targetClass.getConstructor(argClasses);
+            this.wrapped = (Renderer)constructor.newInstance(renderer);
+        }
+        catch (Throwable e)
+        {
+            if(logger.isWarnEnabled())
+            {
+                logger.warn("no extval renderer proxy created for " + renderer.getClass().getName());
+            }
+        }
 
         if(logger.isTraceEnabled())
         {

Modified: myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java?rev=719377&r1=719376&r2=719377&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java (original)
+++ myfaces/extensions/validator/branches/jsf_1.1/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java Thu Nov 20 13:19:19 2008
@@ -23,6 +23,7 @@
 import org.apache.myfaces.extensions.validator.core.interceptor.ValidationInterceptor;
 import org.apache.myfaces.extensions.validator.core.ExtValContext;
 import org.apache.myfaces.extensions.validator.core.CustomInfo;
+import org.apache.myfaces.extensions.validator.core.renderkit.ExtValRendererProxy;
 import org.apache.myfaces.extensions.validator.util.ClassUtils;
 import org.apache.myfaces.extensions.validator.ExtValInformation;
 
@@ -52,6 +53,9 @@
         AbstractStartupListener customStartupListener =
             (AbstractStartupListener)ClassUtils.tryToInstantiateClassForName(customStartupListenerName);
 
+        ExtValContext.getContext()
+                .addGlobalProperty(ExtValRendererProxy.KEY, ExtValRendererProxy.class.getName(), false);
+
         if(customStartupListener != null)
         {
             if(logger.isInfoEnabled())
@@ -67,4 +71,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}