You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2011/02/04 22:10:39 UTC

svn commit: r1067286 - in /myfaces/core/trunk/impl/src: main/java/org/apache/myfaces/view/facelets/tag/composite/ test/java/org/apache/myfaces/view/facelets/tag/composite/ test/resources/org/apache/myfaces/view/facelets/tag/composite/ test/resources/or...

Author: lu4242
Date: Fri Feb  4 21:10:39 2011
New Revision: 1067286

URL: http://svn.apache.org/viewvc?rev=1067286&view=rev
Log:
MYFACES-3027 cc:attribute type="java.lang.Integer" does not enforce Integer when value is taken from facelets template

Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttributeHandler.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentRule.java
    myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentTestCase.java
    myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/composite/resources/testComposite/simpleAttribute.xhtml
    myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/composite/testSimpleAttribute.xhtml

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttributeHandler.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttributeHandler.java?rev=1067286&r1=1067285&r2=1067286&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttributeHandler.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttributeHandler.java Fri Feb  4 21:10:39 2011
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import javax.el.ValueExpression;
 import javax.faces.application.ProjectStage;
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
@@ -37,6 +38,7 @@ import javax.faces.view.facelets.TagHand
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletAttribute;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletTag;
 import org.apache.myfaces.view.facelets.FaceletCompositionContext;
+import org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage;
 
 /**
  * @author Leonardo Uribe (latest modification by $Author$)
@@ -318,7 +320,36 @@ public class AttributeHandler extends Ta
             }
             if (_default != null)
             {
-                attributeDescriptor.setValue("default", _default.getValueExpression(ctx, String.class));
+                if (_type != null)
+                {
+                    String type = _type.getValue(ctx);
+                    Class clazz = String.class;
+                    if (type != null)
+                    {
+                        try
+                        {
+                            clazz = FaceletViewDeclarationLanguage._javaTypeToClass(type);
+                        }
+                        catch (ClassNotFoundException e)
+                        {
+                            //Assume String
+                        }
+                    }
+                    
+                    if (_default.isLiteral())
+                    {
+                        //If it is literal, calculate it and store it on a ValueExpression
+                        attributeDescriptor.setValue("default", _default.getObject(ctx, clazz));
+                    }
+                    else
+                    {
+                        attributeDescriptor.setValue("default", _default.getValueExpression(ctx, clazz));
+                    }
+                }
+                else
+                {
+                    attributeDescriptor.setValue("default", _default.getValueExpression(ctx, String.class));
+                }
             }
             if (_required != null)
             {

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentRule.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentRule.java?rev=1067286&r1=1067285&r2=1067286&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentRule.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentRule.java Fri Feb  4 21:10:39 2011
@@ -56,6 +56,25 @@ final class CompositeComponentRule exten
             //        ctx.getFacesContext().getApplication().getExpressionFactory().createValueExpression(_value, Object.class));
         }
     }
+    
+    final class TypedLiteralAttributeMetadata extends Metadata
+    {
+        private final String _name;
+        private final TagAttribute _attr;
+        private final Class<?> _type;
+
+        public TypedLiteralAttributeMetadata(String name, Class<?> type, TagAttribute attr)
+        {
+            _name = name;
+            _attr = attr;
+            _type = type;
+        }
+
+        public void applyMetadata(FaceletContext ctx, Object instance)
+        {
+            ((UIComponent) instance).getAttributes().put(_name, _attr.getObject(ctx, _type));
+        }
+    }
 
     final static class ValueExpressionMetadata extends Metadata
     {
@@ -116,11 +135,21 @@ final class CompositeComponentRule exten
             }
             else if (meta.getWriteMethod(name) == null)
             {
+                Class<?> type = meta.getPropertyType(name);
+                if (type == null)
+                {
+                    if (meta.getProperty(name) == null)
+                    {
+                        // this was an attribute literal, but not property
+                        warnAttr(attribute, meta.getTargetClass(), name);
+                    }
 
-                // this was an attribute literal, but not property
-                warnAttr(attribute, meta.getTargetClass(), name);
-
-                return new LiteralAttributeMetadata(name, attribute.getValue());
+                    return new LiteralAttributeMetadata(name, attribute.getValue());
+                }
+                else
+                {
+                    return new TypedLiteralAttributeMetadata(name, type, attribute);
+                }
             }
         }
         return null;

Modified: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentTestCase.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentTestCase.java?rev=1067286&r1=1067285&r2=1067286&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentTestCase.java (original)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/tag/composite/CompositeComponentTestCase.java Fri Feb  4 21:10:39 2011
@@ -22,6 +22,7 @@ package org.apache.myfaces.view.facelets
 import java.io.StringWriter;
 
 import javax.el.MethodExpression;
+import javax.el.ValueExpression;
 import javax.faces.component.UICommand;
 import javax.faces.component.UIComponent;
 import javax.faces.component.UIInput;
@@ -102,6 +103,12 @@ public class CompositeComponentTestCase 
         Assert.assertEquals("class1", text1.getStyleClass());
         //set as default
         Assert.assertEquals("background:red", text1.getStyle());
+        //Check coercion of attribute using type value
+        Assert.assertEquals(5, compositeComponent1.getAttributes().get("index"));
+        //Check default coercion
+        ValueExpression ve = facesContext.getApplication().getExpressionFactory().createValueExpression(
+                facesContext.getELContext(), "#{cc.attrs.cols}", Object.class);
+        Assert.assertEquals(1, ve.getValue(facesContext.getELContext()));
         text1.popComponentFromEL(facesContext);
         facet1.popComponentFromEL(facesContext);
         compositeComponent1.popComponentFromEL(facesContext);

Modified: myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/composite/resources/testComposite/simpleAttribute.xhtml
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/composite/resources/testComposite/simpleAttribute.xhtml?rev=1067286&r1=1067285&r2=1067286&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/composite/resources/testComposite/simpleAttribute.xhtml (original)
+++ myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/composite/resources/testComposite/simpleAttribute.xhtml Fri Feb  4 21:10:39 2011
@@ -24,6 +24,8 @@
 <composite:interface>
     <composite:attribute name="style" default="background:red"/>
     <composite:attribute name="styleClass" />
+    <composite:attribute name="index" type="java.lang.Integer"/>
+    <composite:attribute name="cols" type="java.lang.Integer" default="1"/>
 </composite:interface>
 <composite:implementation>
     <h:outputText id="text" value="Hello World" style="#{cc.attrs.style}" styleClass="#{cc.attrs.styleClass}"/>

Modified: myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/composite/testSimpleAttribute.xhtml
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/composite/testSimpleAttribute.xhtml?rev=1067286&r1=1067285&r2=1067286&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/composite/testSimpleAttribute.xhtml (original)
+++ myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/composite/testSimpleAttribute.xhtml Fri Feb  4 21:10:39 2011
@@ -22,7 +22,7 @@
 </head>
 <body>
 <h:panelGroup id="testGroup1">
-<testComposite:simpleAttribute styleClass="class1">
+<testComposite:simpleAttribute styleClass="class1" index="5">
 </testComposite:simpleAttribute>
 </h:panelGroup>