You are viewing a plain text version of this content. The canonical link for it is here.
Posted to adffaces-commits@incubator.apache.org by aw...@apache.org on 2006/10/05 02:51:36 UTC

svn commit: r453091 - in /incubator/adffaces/branches/faces-1_2: plugins/maven-faces-plugin/ plugins/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/ plugins/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbui...

Author: awiner
Date: Wed Oct  4 19:51:35 2006
New Revision: 453091

URL: http://svn.apache.org/viewvc?view=rev&rev=453091
Log:
Switch JSF 1.2 taglib to JSP 2.1;  update generator code to generate proper JSP 2.1 TLD and tag handlers.  Haven't actually tested any of this yet, mind you, but it does actually all compile.

Added:
    incubator/adffaces/branches/faces-1_2/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/webapp/UIXComponentELTag.java
    incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/util/MethodExpressionMethodBinding.java
Modified:
    incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/pom.xml
    incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateJspTaglibsMojo.java
    incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/PropertyBean.java
    incubator/adffaces/branches/faces-1_2/trinidad/pom.xml
    incubator/adffaces/branches/faces-1_2/trinidad/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/components/trinidad/ComponentBase.xml
    incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/pom.xml
    incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/conf/META-INF/tr-base.tld
    incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/conf/META-INF/trh-base.tld
    incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/binding/AccessKeyBinding.java
    incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/binding/StripAccessKeyBinding.java
    incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/util/VirtualAttributeUtils.java
    incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/test/java/org/apache/myfaces/trinidadinternal/taglib/TLDTest.java

Modified: incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/pom.xml
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/pom.xml?view=diff&rev=453091&r1=453090&r2=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/pom.xml (original)
+++ incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/pom.xml Wed Oct  4 19:51:35 2006
@@ -9,7 +9,7 @@
 
   <groupId>org.apache.myfaces.trinidadbuild</groupId>
   <artifactId>maven-faces-plugin</artifactId> 
-  <version>incubator-m1-SNAPSHOT</version>
+  <version>incubator-1.2-m1-SNAPSHOT</version>
   <packaging>maven-plugin</packaging>
   <name>Maven Faces Plugin</name>
 

Modified: incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateJspTaglibsMojo.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateJspTaglibsMojo.java?view=diff&rev=453091&r1=453090&r2=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateJspTaglibsMojo.java (original)
+++ incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateJspTaglibsMojo.java Wed Oct  4 19:51:35 2006
@@ -28,6 +28,7 @@
 import java.lang.reflect.Modifier;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
@@ -216,7 +217,7 @@
           XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
           XMLStreamWriter stream = outputFactory.createXMLStreamWriter(out);
 
-          _writeStartTagLibrary(stream, "1.2", shortName, namespaceURI);
+          _writeStartTagLibrary(stream, _is12() ? "2.1" : "1.2", shortName, namespaceURI);
           while (components.hasNext())
           {
             ComponentBean component = (ComponentBean)components.next();
@@ -276,9 +277,18 @@
   {
     stream.writeStartDocument("1.0");
     stream.writeCharacters("\n");
-    stream.writeDTD(dtd);
+    if (!_is12())
+      stream.writeDTD(dtd);
     stream.writeCharacters("\n");
     stream.writeStartElement("taglib");
+    if (_is12())
+    {
+      stream.writeNamespace("", "http://java.sun.com/xml/ns/javaee");
+      stream.writeNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
+      stream.writeAttribute("xsi:schemaLocation", "http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd");
+      stream.writeAttribute("version", "2.1");
+    }
+
     stream.writeCharacters("\n  ");
   }
 
@@ -327,13 +337,6 @@
     stream.writeCharacters("\n  ");
     stream.writeStartElement("tag");
     stream.writeCharacters("\n    ");
-    stream.writeStartElement("name");
-    stream.writeCharacters(component.getTagName().getLocalPart());
-    stream.writeEndElement();
-    stream.writeCharacters("\n    ");
-    stream.writeStartElement("tag-class");
-    stream.writeCharacters(component.getTagClass());
-    stream.writeEndElement();
     if (component.getDescription() != null)
     {
       stream.writeCharacters("\n    ");
@@ -342,6 +345,14 @@
       stream.writeEndElement();
     }
 
+    stream.writeStartElement("name");
+    stream.writeCharacters(component.getTagName().getLocalPart());
+    stream.writeEndElement();
+    stream.writeCharacters("\n    ");
+    stream.writeStartElement("tag-class");
+    stream.writeCharacters(component.getTagClass());
+    stream.writeEndElement();
+
     Iterator properties = component.properties(true);
     properties = new FilteredIterator(properties, new TagAttributeFilter());
     while (properties.hasNext())
@@ -350,7 +361,8 @@
       _writeTagAttribute(stream,
                          property.getPropertyName(),
                          property.getDescription(),
-                         property.getUnsupportedAgents());
+                         property.getUnsupportedAgents(),
+                         property);
     }
 
     stream.writeCharacters("\n  ");
@@ -367,13 +379,6 @@
     stream.writeCharacters("\n  ");
     stream.writeStartElement("tag");
     stream.writeCharacters("\n    ");
-    stream.writeStartElement("name");
-    stream.writeCharacters(converter.getTagName().getLocalPart());
-    stream.writeEndElement();
-    stream.writeCharacters("\n    ");
-    stream.writeStartElement("tag-class");
-    stream.writeCharacters(converter.getTagClass());
-    stream.writeEndElement();
     if (converter.getDescription() != null)
     {
       stream.writeCharacters("\n    ");
@@ -382,8 +387,16 @@
       stream.writeEndElement();
     }
 
+    stream.writeStartElement("name");
+    stream.writeCharacters(converter.getTagName().getLocalPart());
+    stream.writeEndElement();
+    stream.writeCharacters("\n    ");
+    stream.writeStartElement("tag-class");
+    stream.writeCharacters(converter.getTagClass());
+    stream.writeEndElement();
+
     // converters need an id attribute
-    _writeTagAttribute(stream, "id", "the identifier for the component", null);
+    _writeTagAttribute(stream, "id", "the identifier for the component", null, null);
 
     Iterator properties = converter.properties();
     properties = new FilteredIterator(properties, new TagAttributeFilter());
@@ -393,7 +406,8 @@
       _writeTagAttribute(stream,
                          property.getPropertyName(),
                          property.getDescription(),
-                         property.getUnsupportedAgents());
+                         property.getUnsupportedAgents(),
+                         property);
     }
 
     stream.writeCharacters("\n  ");
@@ -404,21 +418,12 @@
     XMLStreamWriter stream,
     String          propertyName,
     String          description,
-    String[]        unsupportedAgents) throws XMLStreamException
+    String[]        unsupportedAgents,
+    PropertyBean    property) throws XMLStreamException
   {
     stream.writeCharacters("\n    ");
     stream.writeStartElement("attribute");
 
-    stream.writeCharacters("\n      ");
-    stream.writeStartElement("name");
-    stream.writeCharacters(propertyName);
-    stream.writeEndElement();
-
-    stream.writeCharacters("\n      ");
-    stream.writeStartElement("rtexprvalue");
-    stream.writeCharacters("false");
-    stream.writeEndElement();
-
     if (description != null ||
         unsupportedAgents.length > 0)
     {
@@ -444,6 +449,73 @@
       stream.writeEndElement();
     }
 
+    stream.writeCharacters("\n      ");
+    stream.writeStartElement("name");
+    stream.writeCharacters(propertyName);
+    stream.writeEndElement();
+
+    if (!_is12())
+    {
+      stream.writeCharacters("\n      ");
+      stream.writeStartElement("rtexprvalue");
+      stream.writeCharacters("false");
+      stream.writeEndElement();
+    }
+    else
+    {
+      if (property != null)
+      {
+        if (property.isRequired())
+        {
+          stream.writeCharacters("\n    ");
+          stream.writeStartElement("required");
+          stream.writeCharacters("true");
+          stream.writeEndElement();
+        }
+        
+        if (property.isMethodExpression() || property.isMethodBinding())
+        {
+          stream.writeCharacters("\n    ");
+          stream.writeStartElement("deferred-method");
+          stream.writeCharacters("\n      ");
+          MethodSignatureBean sig = property.getMethodBindingSignature();
+          if (sig != null)
+          {
+            stream.writeStartElement("method-signature");
+            stream.writeCharacters(sig.getReturnType());
+            stream.writeCharacters(" myMethod(");
+            String[] params = sig.getParameterTypes();
+            for (int i = 0; i < params.length; i++)
+            {
+              if (i > 0)
+                stream.writeCharacters(", ");
+              stream.writeCharacters(params[i]);
+              stream.writeCharacters(" a" + i);
+            }
+
+            stream.writeCharacters(")");
+            stream.writeEndElement();
+          }
+          stream.writeEndElement();
+        }
+        else if (!property.isLiteralOnly())
+        {
+          stream.writeCharacters("\n    ");
+          stream.writeStartElement("deferred-value");
+          if (_CAN_COERCE.contains(property.getPropertyClass()))
+          {
+            stream.writeCharacters("\n      ");
+            stream.writeStartElement("type");
+            stream.writeCharacters(property.getPropertyClass());
+            stream.writeEndElement();
+            stream.writeCharacters("\n    ");
+          }
+
+          stream.writeEndElement();
+        }
+      }
+    }
+
     stream.writeCharacters("\n    ");
     stream.writeEndElement();
   }
@@ -474,7 +546,7 @@
     }
 
     // validators need an id attribute
-    _writeTagAttribute(stream, "id", "the identifier for the component", null);
+    _writeTagAttribute(stream, "id", "the identifier for the component", null, null);
 
     Iterator properties = validator.properties();
     properties = new FilteredIterator(properties, new TagAttributeFilter());
@@ -484,7 +556,8 @@
       _writeTagAttribute(stream,
                          property.getPropertyName(),
                          property.getDescription(),
-                         property.getUnsupportedAgents());
+                         property.getUnsupportedAgents(),
+                         property);
     }
 
     stream.writeCharacters("\n  ");
@@ -594,8 +667,17 @@
         out.println(" * Auto-generated tag class.");
         out.println(" */");
 
-        out.println("public class " + className +
-                          " extends ConverterTag");
+        if (_is12())
+        {
+          out.println("public class " + className +
+                      " extends ConverterELTag");
+        }
+        else
+        {
+          out.println("public class " + className +
+                      " extends ConverterTag");
+        }
+
         out.println("{");
         out.indent();
 
@@ -633,7 +715,15 @@
     {
       Set imports = new TreeSet();
 
-      imports.add("javax.faces.webapp.ConverterTag");
+      if (_is12())
+      {
+        imports.add("javax.faces.webapp.ConverterELTag");
+        imports.add("javax.faces.context.FacesContext");
+        imports.add("javax.faces.application.Application");
+      }
+      else
+        imports.add("javax.faces.webapp.ConverterTag");
+        
       imports.add("javax.servlet.jsp.JspException");
       imports.add(converter.getConverterClass());
 
@@ -730,19 +820,22 @@
       PrettyWriter  out,
       ConverterBean converter) throws IOException
     {
-      String converterFullClass = converter.getConverterClass();
-      String converterClass = Util.getClassFromFullClass(converterFullClass);
-
-      out.println();
-      // TODO: restore coding standards, and make final
-      out.println("@Override");
-      out.println("public int doStartTag() throws JspException");
-      out.println("{");
-      out.indent();
-      out.println("super.setConverterId(" + converterClass + ".CONVERTER_ID);");
-      out.println("return super.doStartTag();");
-      out.unindent();
-      out.println("}");
+      if (!_is12())
+      {
+        String converterFullClass = converter.getConverterClass();
+        String converterClass = Util.getClassFromFullClass(converterFullClass);
+        
+        out.println();
+        // TODO: restore coding standards, and make final
+        out.println("@Override");
+        out.println("public int doStartTag() throws JspException");
+        out.println("{");
+        out.indent();
+        out.println("super.setConverterId(" + converterClass + ".CONVERTER_ID);");
+        out.println("return super.doStartTag();");
+        out.unindent();
+        out.println("}");
+      }
     }
 
     private void _writeCreateConverter(
@@ -762,8 +855,18 @@
         out.println("protected Converter createConverter() throws JspException");
         out.println("{");
         out.indent();
-        out.println(converterClass + " converter = " +
-                    "(" + converterClass + ")super.createConverter();");
+        if (_is12())
+        {
+          out.println("String converterId = " + converterClass +  ".CONVERTER_ID;");
+          out.println("Application appl = FacesContext.getCurrentInstance().getApplication();");
+          out.println(converterClass + " converter = " +
+                      "(" + converterClass + ")appl.createConverter(converterId);");
+        }
+        else
+        {
+          out.println(converterClass + " converter = " +
+                      "(" + converterClass + ")super.createConverter();");
+        }
         out.println("_setProperties(converter);");
         out.println("return converter;");
         out.unindent();
@@ -910,8 +1013,17 @@
         out.println(" * Auto-generated tag class.");
         out.println(" */");
 
-        out.println("public class " + className +
-                          " extends ValidatorTag");
+        if (_is12())
+        {
+          out.println("public class " + className +
+                      " extends ValidatorELTag");
+        }
+        else
+        {
+          out.println("public class " + className +
+                      " extends ValidatorTag");
+        }
+
         out.println("{");
         out.indent();
 
@@ -949,7 +1061,15 @@
     {
       Set imports = new TreeSet();
 
-      imports.add("javax.faces.webapp.ValidatorTag");
+      if (_is12())
+      {
+        imports.add("javax.faces.webapp.ValidatorELTag");
+        imports.add("javax.faces.context.FacesContext");
+        imports.add("javax.faces.application.Application");
+      }
+      else
+        imports.add("javax.faces.webapp.ValidatorTag");
+
       imports.add("javax.servlet.jsp.JspException");
       imports.add(validator.getValidatorClass());
 
@@ -1046,19 +1166,22 @@
       PrettyWriter  out,
       ValidatorBean validator) throws IOException
     {
-      String validatorFullClass = validator.getValidatorClass();
-      String validatorClass = Util.getClassFromFullClass(validatorFullClass);
-
       out.println();
-      // TODO: restore coding standards, and make final
-      out.println("@Override");
-      out.println("public int doStartTag() throws JspException");
-      out.println("{");
-      out.indent();
-      out.println("super.setValidatorId(" + validatorClass + ".VALIDATOR_ID);");
-      out.println("return super.doStartTag();");
-      out.unindent();
-      out.println("}");
+      if (!_is12())
+      {
+        String validatorFullClass = validator.getValidatorClass();
+        String validatorClass = Util.getClassFromFullClass(validatorFullClass);
+
+        // TODO: restore coding standards, and make final
+        out.println("@Override");
+        out.println("public int doStartTag() throws JspException");
+        out.println("{");
+        out.indent();
+        out.println("super.setValidatorId(" + validatorClass + ".VALIDATOR_ID);");
+        out.println("return super.doStartTag();");
+        out.unindent();
+        out.println("}");
+      }
     }
 
     private void _writeCreateValidator(
@@ -1078,8 +1201,18 @@
         out.println("protected Validator createValidator() throws JspException");
         out.println("{");
         out.indent();
-        out.println(validatorClass + " validator = " +
-                    "(" + validatorClass + ")super.createValidator();");
+        if (_is12())
+        {
+          out.println("String validatorId = " + validatorClass + ".VALIDATOR_ID;");
+          out.println("Application appl = FacesContext.getCurrentInstance().getApplication();");
+          out.println(validatorClass + " validator = " +
+                      "(" + validatorClass + ")appl.createValidator(validatorId);");
+        }
+        else
+        {
+          out.println(validatorClass + " validator = " +
+                      "(" + validatorClass + ")super.createValidator();");
+        }
         out.println("_setProperties(validator);");
         out.println("return validator;");
         out.unindent();
@@ -1321,6 +1454,8 @@
           imports.add(propertyClass);
         }
 
+        imports.add("javax.el.ValueExpression");
+
         if (_isKeyStroke(propertyClass))
         {
           imports.add("javax.faces.el.ValueBinding");
@@ -1349,7 +1484,19 @@
         }
         else if (property.isMethodBinding())
         {
-          imports.add("javax.faces.el.MethodBinding");
+          if (_is12())
+          {
+            imports.add("javax.el.MethodExpression");
+            imports.add("org.apache.myfaces.trinidadinternal.taglib.util.MethodExpressionMethodBinding");
+          }
+          else
+          {
+            imports.add("javax.faces.el.MethodBinding");
+          }
+        }
+        else if (property.isMethodExpression())
+        {
+          imports.add("javax.el.MethodExpression");
         }
 
         // TODO: restore import and make reference to
@@ -1483,7 +1630,22 @@
     {
       String propName = property.getPropertyName();
       String propVar = "_" + Util.getVariableFromName(propName);
-      out.println("private String " + propVar + ";");
+      String jspPropType = _getJspPropertyType(property);
+      
+      out.println("private " + jspPropType + " " + propVar + ";");
+    }
+
+    private String _getJspPropertyType(PropertyBean property)
+    {
+      if (property.isMethodExpression())
+        return "MethodExpression";
+
+      if (_is12() && property.isMethodBinding())
+        return "MethodExpression";
+
+      if (_is12() && !property.isLiteralOnly())
+        return "ValueExpression";
+      return "String";
     }
 
     private void _writePropertySet(
@@ -1493,9 +1655,10 @@
       String propName = property.getPropertyName();
       String propVar = Util.getVariableFromName(propName);
       String setMethod = Util.getPrefixedPropertyName("set", propName);
+      String jspPropType = _getJspPropertyType(property);
 
       // TODO: restore coding standards, and make final
-      out.println("public void " + setMethod + "(String " + propVar + ")");
+      out.println("public void " + setMethod + "(" + jspPropType + " " + propVar + ")");
       out.println("{");
       out.indent();
       out.println("_" + propVar + " = " + propVar + ";");
@@ -1550,6 +1713,10 @@
       {
         _writeSetMethodBinding(out, componentClass, property);
       }
+      else if (property.isMethodExpression())
+      {
+        _writeSetMethodExpression(out, componentClass, property);
+      }
       else if (_isKeyStroke(propClass))
       {
         _writeSetKeyStroke(out, componentClass, propName);
@@ -1646,11 +1813,25 @@
       PrettyWriter out,
       String       componentClass,
       String       propName,
-      String       propClass,
+      String       propFullClass,
       String       propVar)
     {
+      String propClass = Util.getClassFromFullClass(propFullClass);
+      String boxedClass = Util.getBoxedClass(propClass);
+      if ((!_is12() && !boxedClass.equals(propClass)) ||
+           "java.util.Date".equals(propFullClass) ||
+          (boxedClass.indexOf("[]") != -1))
+      {
         // TODO: reject value binding expressions for literal-only
-      _writeSetProperty(out, componentClass, propName, propClass, propVar);
+        _writeSetProperty(out, componentClass, propName, propFullClass, propVar);
+      }
+      else
+      {
+        String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
+        out.println("bean.setProperty(" +
+                    componentClass + "." + propKey + ", " +
+                    propVar + ");" );
+       }
     }
 
     private void _writeSetProperty(
@@ -1664,13 +1845,14 @@
       String propClass = Util.getClassFromFullClass(propFullClass);
       String boxedClass = Util.getBoxedClass(propClass);
       String setProperty = "setProperty";
-      if (!boxedClass.equals(propClass) ||
+      if ((!_is12() && !boxedClass.equals(propClass)) ||
            "java.util.Date".equals(propFullClass) ||
           (boxedClass.indexOf("[]") != -1))
       {
         String propType = boxedClass.replaceAll("\\[\\]", "Array");
         setProperty = Util.getPrefixedPropertyName("set", propType + "Property");
       }
+      
       out.println(setProperty + "(bean, " +
                                   componentClass + "." + propKey + ", " +
                                   propVar + ");" );
@@ -1698,31 +1880,67 @@
       out.println("if (" + propVar + " != null)");
       out.println("{");
       out.indent();
-      out.println("if (isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
-      out.println("VirtualAttributeUtils.setAccessKeyAttribute(");
-      out.indent();
-      out.println("bean,");
-      out.println("vb,");
-      out.println(propKeys[0] + ",");
-      out.println(propKeys[1] +  ");");
-      out.unindent();
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("VirtualAttributeUtils.setAccessKeyAttribute(");
-      out.indent();
-      out.println("bean,");
-      out.println(propVar + ",");
-      out.println(propKeys[0] + ",");
-      out.println(propKeys[1] +  ");");
-      out.unindent();
-      out.unindent();
-      out.println("}");
+
+      if (_is12())
+      {
+        out.println("if (!" + propVar + ".isLiteralText())");
+        out.println("{");
+        out.indent();
+        out.println("VirtualAttributeUtils.setAccessKeyAttribute(");
+        out.indent();
+        out.println("bean,");
+        out.println(propVar + ",");
+        out.println(propKeys[0] + ",");
+        out.println(propKeys[1] +  ");");
+        out.unindent();
+        out.unindent();
+        out.println("}");
+        out.println("else");
+        out.println("{");
+        out.indent();
+        out.println("Object o = " + propVar + ".getValue(null);");
+        out.println("if (o != null)");
+        out.indent();
+        out.println("VirtualAttributeUtils.setAccessKeyAttribute(");
+        out.indent();
+        out.println("bean,");
+        out.println("o.toString(),");
+        out.println(propKeys[0] + ",");
+        out.println(propKeys[1] +  ");");
+        out.unindent();
+        out.unindent();
+        out.unindent();
+        out.println("}");
+      }
+      else
+      {
+        out.println("if (isValueReference(" + propVar + "))");
+        out.println("{");
+        out.indent();
+        out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
+        out.println("VirtualAttributeUtils.setAccessKeyAttribute(");
+        out.indent();
+        out.println("bean,");
+        out.println("vb,");
+        out.println(propKeys[0] + ",");
+        out.println(propKeys[1] +  ");");
+        out.unindent();
+        out.unindent();
+        out.println("}");
+        out.println("else");
+        out.println("{");
+        out.indent();
+        out.println("VirtualAttributeUtils.setAccessKeyAttribute(");
+        out.indent();
+        out.println("bean,");
+        out.println(propVar + ",");
+        out.println(propKeys[0] + ",");
+        out.println(propKeys[1] +  ");");
+        out.unindent();
+        out.unindent();
+        out.println("}");
+      }
+
       out.unindent();
       out.println("}");
     }
@@ -1736,89 +1954,139 @@
       String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
       String propVar = "_" + propName;
 
-      MethodSignatureBean signature = property.getMethodBindingSignature();
-      String[] paramTypes = (signature != null) ? signature.getParameterTypes() : null;
-
-      String classArray;
-
-      if (paramTypes == null || paramTypes.length == 0)
+      if (_is12())
       {
-        classArray = "new Class[0]";
+        out.println("bean.setProperty(" + componentClass + "." + propKey + ", " +
+                    "new MethodExpressionMethodBinding(" + propVar + "));");
       }
       else
       {
-        StringBuffer sb = new StringBuffer();
-        sb.append("new Class[]{");
-        for (int i=0; i < paramTypes.length; i++)
+        MethodSignatureBean signature = property.getMethodBindingSignature();
+        String[] paramTypes = (signature != null) ? signature.getParameterTypes() : null;
+        
+        String classArray;
+        
+        if (paramTypes == null || paramTypes.length == 0)
+        {
+          classArray = "new Class[0]";
+        }
+        else
+        {
+          StringBuffer sb = new StringBuffer();
+          sb.append("new Class[]{");
+          for (int i=0; i < paramTypes.length; i++)
+          {
+            if (i > 0)
+              sb.append(',');
+            sb.append(paramTypes[i]);
+            sb.append(".class");
+          }
+          
+          // TODO: remove trailing comma
+          sb.append(',');
+          
+          sb.append('}');
+          classArray = sb.toString();
+        }
+        
+        out.println("if (" + propVar + " != null)");
+        out.println("{");
+        out.indent();
+        
+        if (isStringMethodBindingReturnType(signature))
+        {
+          out.println("MethodBinding mb;");
+          out.println("if (isValueReference(" + propVar + "))");
+          out.indent();
+          out.println("mb = createMethodBinding(" + propVar + ", " + classArray + ");");
+          out.unindent();
+          out.println("else");
+          out.indent();
+          out.println("mb = new org.apache.myfaces.trinidadinternal.taglib.ConstantMethodBinding(" + propVar + ");");
+          out.unindent();
+        }
+        else
         {
-          if (i > 0)
-            sb.append(',');
-          sb.append(paramTypes[i]);
-          sb.append(".class");
+          // never a literal, no need for ConstantMethodBinding
+          out.println("MethodBinding mb = createMethodBinding(" + propVar + ", " +
+                      classArray + ");");
         }
+        
+        out.println("bean.setProperty(" + componentClass + "." + propKey + ", mb);");
+        out.unindent();
+        out.println("}");
+      }
+    }
 
-        // TODO: remove trailing comma
-        sb.append(',');
+    private void _writeSetMethodExpression(
+      PrettyWriter  out,
+      String             componentClass,
+      PropertyBean        property) throws IOException
+    {
+      String propName = property.getPropertyName();
+      String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
+      String propVar = "_" + propName;
 
-        sb.append('}');
-        classArray = sb.toString();
-      }
+      out.println("bean.setProperty(" + componentClass + "." + propKey + ", " +
+                  propVar + ");");
+    }
 
-      out.println("if (" + propVar + " != null)");
-      out.println("{");
-      out.indent();
+    private void _writeSetKeyStroke(
+      PrettyWriter  out,
+      String        componentClass,
+      String        propName) throws IOException
+    {
+      String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
+      String propVar = "_" + propName;
 
-      if (isStringMethodBindingReturnType(signature))
+
+      if (_is12())
       {
-        out.println("MethodBinding mb;");
-        out.println("if (isValueReference(" + propVar + "))");
+        out.println("if (" + propVar + " != null)");
+        out.println("{");
         out.indent();
-        out.println("mb = createMethodBinding(" + propVar + ", " + classArray + ");");
+        out.println("if (!" + propVar + ".isLiteralText())");
+        out.println("{");
+        out.indent();
+        out.println("bean.setValueExpression(" + componentClass + "." + propKey + ", " + propVar + ");");
         out.unindent();
+        out.println("}");
         out.println("else");
+        out.println("{");
+        out.indent();
+        out.println("Object val = " + propVar + ".getValue(null);");
+        out.println("if (val != null)");
         out.indent();
-        out.println("mb = new org.apache.myfaces.trinidadinternal.taglib.ConstantMethodBinding(" + propVar + ");");
+        out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
+        out.println("\tKeyStroke.getKeyStroke(val.toString()));");
         out.unindent();
+        out.unindent();
+        out.println("}");
+        out.unindent();
+        out.println("}");
       }
       else
       {
-        // never a literal, no need for ConstantMethodBinding
-        out.println("MethodBinding mb = createMethodBinding(" + propVar + ", " +
-                                                            classArray + ");");
+        out.println("if (" + propVar + " != null)");
+        out.println("{");
+        out.indent();
+        out.println("if (isValueReference(" + propVar + "))");
+        out.println("{");
+        out.indent();
+        out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
+        out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", vb);");
+        out.unindent();
+        out.println("}");
+        out.println("else");
+        out.println("{");
+        out.indent();
+        out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
+        out.println("\tKeyStroke.getKeyStroke(" + propVar + "));");
+        out.unindent();
+        out.println("}");
+        out.unindent();
+        out.println("}");
       }
-
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ", mb);");
-      out.unindent();
-      out.println("}");
-    }
-
-    private void _writeSetKeyStroke(
-      PrettyWriter  out,
-      String        componentClass,
-      String        propName) throws IOException
-    {
-      String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-      String propVar = "_" + propName;
-
-      out.println("if (" + propVar + " != null)");
-      out.println("{");
-      out.indent();
-      out.println("if (isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
-      out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", vb);");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
-      out.println("\tKeyStroke.getKeyStroke(" + propVar + "));");
-      out.unindent();
-      out.println("}");
-      out.unindent();
-      out.println("}");
     }
 
 
@@ -1864,32 +2132,69 @@
       out.println("if (" + propVar + " != null)");
       out.println("{");
       out.indent();
-      out.println("if (isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
-      out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", vb);");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("try");
-      out.println("{");
-      out.indent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
-      out.println("                 TagUtils.getColorList(" + propVar + "));");
-      out.unindent();
-      out.println("}");
-      out.println("catch (ParseException pe)");
-      out.println("{");
-      out.indent();
-      out.println("setValidationError(");
-      out.println("  pe.getMessage() + \": \" + \"Position \" + pe.getErrorOffset());");
-      out.unindent();
-      out.println("}");
-      out.unindent();
-      out.println("}");
+      if (_is12())
+      {
+        out.println("if (!" + propVar + ".isLiteralText())");
+        out.println("{");
+        out.indent();
+        out.println("bean.setValueExpression(" + componentClass + "." + propKey + ", " + propVar + ");");
+        out.unindent();
+        out.println("}");
+        out.println("else");
+        out.println("{");
+        out.indent();
+        out.println("Object o = " + propVar + ".getValue(null);");
+        out.println("if (o != null)");
+        out.indent();
+        out.println("{");
+        out.println("try");
+        out.println("{");
+        out.indent();
+        out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
+        out.println("                 TagUtils.getColorList(o.toString()));");
+        out.unindent();
+        out.println("}");
+        out.println("catch (ParseException pe)");
+        out.println("{");
+        out.indent();
+        out.println("setValidationError(");
+        out.println("  pe.getMessage() + \": \" + \"Position \" + pe.getErrorOffset());");
+        out.unindent();
+        out.println("}");
+        out.unindent();
+        out.println("}");
+        out.unindent();
+        out.println("}");        
+      }
+      else
+      {
+        out.println("if (isValueReference(" + propVar + "))");
+        out.println("{");
+        out.indent();
+        out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
+        out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", vb);");
+        out.unindent();
+        out.println("}");
+        out.println("else");
+        out.println("{");
+        out.indent();
+        out.println("try");
+        out.println("{");
+        out.indent();
+        out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
+        out.println("                 TagUtils.getColorList(" + propVar + "));");
+        out.unindent();
+        out.println("}");
+        out.println("catch (ParseException pe)");
+        out.println("{");
+        out.indent();
+        out.println("setValidationError(");
+        out.println("  pe.getMessage() + \": \" + \"Position \" + pe.getErrorOffset());");
+        out.unindent();
+        out.println("}");
+        out.unindent();
+        out.println("}");
+      }
       out.unindent();
       out.println("}");
     }
@@ -1906,23 +2211,54 @@
       out.println("if (" + propVar + " != null)");
       out.println("{");
       out.indent();
-      out.println("if (isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
-      out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", vb);");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("Converter converter = getFacesContext().getApplication().");
-      out.indent();
-      out.println("createConverter(" + propVar + ");");
-      out.unindent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ", converter);");
-      out.unindent();
-      out.println("}");
+      if (_is12())
+      {
+        out.println("if (!" + propVar + ".isLiteralText())");
+        out.println("{");
+        out.indent();
+        out.println("bean.setValueExpression(" + componentClass + "." + propKey + ", " + propVar + ");");
+        out.unindent();
+        out.println("}");
+        out.println("else");
+        out.println("{");
+        out.indent();
+        out.println("Object o = " + propVar + ".getValue(null);");
+        out.println("if (o != null)");
+        out.println("{");
+
+        out.indent();
+        out.println("Converter converter = getFacesContext().getApplication().");
+        out.indent();
+        out.println("createConverter(o.toString());");
+        out.unindent();
+        out.println("bean.setProperty(" + componentClass + "." + propKey + ", converter);");
+        
+        out.unindent();
+        out.println("}");
+        
+        out.unindent();
+        out.println("}");
+      }
+      else
+      {
+        out.println("if (isValueReference(" + propVar + "))");
+        out.println("{");
+        out.indent();
+        out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
+        out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", vb);");
+        out.unindent();
+        out.println("}");
+        out.println("else");
+        out.println("{");
+        out.indent();
+        out.println("Converter converter = getFacesContext().getApplication().");
+        out.indent();
+        out.println("createConverter(" + propVar + ");");
+        out.unindent();
+        out.println("bean.setProperty(" + componentClass + "." + propKey + ", converter);");
+        out.unindent();
+        out.println("}");
+      }
       out.unindent();
       out.println("}");
     }
@@ -1934,6 +2270,11 @@
     return (sig != null && "java.lang.String".equals(sig.getReturnType()));
   }
 
+  private boolean _is12()
+  {
+    return "1.2".equals(jsfVersion) || "12".equals(jsfVersion);
+  }
+
   private class IfComponentModifiedFilter extends ComponentFilter
   {
     protected boolean accept(
@@ -2040,6 +2381,12 @@
    */
   private boolean force;
 
+  
+  /**
+   * @parameter
+   */
+  private String jsfVersion;
+
   static private String _resolveType(
     String className)
   {
@@ -2087,4 +2434,26 @@
     "          href     CDATA #IMPLIED\n" +
     "          xpointer CDATA #IMPLIED>\n" +
     "]>\n";
-}
+
+  static final private Set _CAN_COERCE = new HashSet();
+  static
+  {
+    _CAN_COERCE.add("java.lang.String");
+    _CAN_COERCE.add("java.lang.Integer");
+    _CAN_COERCE.add("java.lang.Long");
+    _CAN_COERCE.add("java.lang.Boolean");
+    _CAN_COERCE.add("java.lang.Double");
+    _CAN_COERCE.add("java.lang.Float");
+    _CAN_COERCE.add("java.lang.Short");
+    _CAN_COERCE.add("java.lang.Character");
+    _CAN_COERCE.add("java.lang.Byte");
+    _CAN_COERCE.add("int");
+    _CAN_COERCE.add("long");
+    _CAN_COERCE.add("boolean");
+    _CAN_COERCE.add("double");
+    _CAN_COERCE.add("float");
+    _CAN_COERCE.add("short");
+    _CAN_COERCE.add("char");
+    _CAN_COERCE.add("byte");
+  }
+}
\ No newline at end of file

Modified: incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/PropertyBean.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/PropertyBean.java?view=diff&rev=453091&r1=453090&r2=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/PropertyBean.java (original)
+++ incubator/adffaces/branches/faces-1_2/plugins/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/PropertyBean.java Wed Oct  4 19:51:35 2006
@@ -280,6 +280,18 @@
     return ("javax.faces.el.MethodBinding".equals(getPropertyClass()));
   }
 
+
+  /**
+   * Returns true if this property is a method binding.
+   *
+   * @return true  if this property is a method binding,
+   *         otherwise false
+   */
+  public boolean isMethodExpression()
+  {
+    return ("javax.el.MethodExpression".equals(getPropertyClass()));
+  }
+
   /**
    * Parses the possible values for this property into a String array
    * using space as the separator between values.

Modified: incubator/adffaces/branches/faces-1_2/trinidad/pom.xml
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/trinidad/pom.xml?view=diff&rev=453091&r1=453090&r2=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/trinidad/pom.xml (original)
+++ incubator/adffaces/branches/faces-1_2/trinidad/pom.xml Wed Oct  4 19:51:35 2006
@@ -222,7 +222,7 @@
         <plugin>
           <groupId>org.apache.myfaces.trinidadbuild</groupId>
           <artifactId>maven-faces-plugin</artifactId>
-          <version>incubator-m1-SNAPSHOT</version>
+          <version>incubator-1.2-m1-SNAPSHOT</version>
           <inherited>true</inherited>
         </plugin>
 

Added: incubator/adffaces/branches/faces-1_2/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/webapp/UIXComponentELTag.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/webapp/UIXComponentELTag.java?view=auto&rev=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/webapp/UIXComponentELTag.java (added)
+++ incubator/adffaces/branches/faces-1_2/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/webapp/UIXComponentELTag.java Wed Oct  4 19:51:35 2006
@@ -0,0 +1,378 @@
+/*
+ * Copyright  2004-2006 The Apache Software Foundation.
+ * 
+ * Licensed 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.trinidad.webapp;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+
+import javax.el.MethodExpression;
+import javax.el.ValueExpression;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.el.MethodBinding;
+import javax.faces.el.ValueBinding;
+import javax.faces.webapp.UIComponentELTag;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.TagSupport;
+
+import org.apache.myfaces.trinidad.bean.FacesBean;
+import org.apache.myfaces.trinidad.bean.PropertyKey;
+import org.apache.myfaces.trinidad.change.AddComponentChange;
+import org.apache.myfaces.trinidad.change.AttributeComponentChange;
+import org.apache.myfaces.trinidad.change.ComponentChange;
+import org.apache.myfaces.trinidad.component.UIXComponent;
+import org.apache.myfaces.trinidad.context.RequestContext;
+import org.apache.myfaces.trinidad.event.AttributeChangeEvent;
+import org.apache.myfaces.trinidad.logging.TrinidadLogger;
+
+/**
+ * Subclass of UIComponentTag to add convenience methods,
+ * and optimize where appropriate.
+ */
+abstract public class UIXComponentELTag extends UIComponentELTag
+{
+  public UIXComponentELTag()
+  {
+  }
+
+  public void setAttributeChangeListener(MethodExpression attributeChangeListener)
+  {
+    _attributeChangeListener = attributeChangeListener;
+  }
+
+  @Override
+  public int doStartTag() throws JspException
+  {
+    int retVal = super.doStartTag();
+
+    //pu: There could have been some validation error during property setting
+    //  on the bean, this is the closest opportunity to burst out.
+    if (_validationError != null)
+      throw new JspException(_validationError);
+
+    return retVal;
+  }
+
+  @Override
+  public int doEndTag() throws JspException
+  {
+    UIComponent component = getComponentInstance();
+    // =-=FIXME AdamWiner: encodeBegin() is no longer called;
+    // for now, always apply changes in both doEndTag() and encodeBegin()
+    //    if (isSuppressed())
+      _applyChanges(getFacesContext(), component, getCreated());
+    return super.doEndTag();
+  }
+
+  /*
+  @Override
+  protected void encodeBegin() throws java.io.IOException
+  {
+    UIComponent component = getComponentInstance();
+    if (!isSuppressed())
+      _applyChanges(getFacesContext(), component, getCreated());
+    super.encodeBegin();
+  }
+  */
+
+  @Override
+  protected final void setProperties(UIComponent component)
+  {
+    super.setProperties(component);
+
+    UIXComponent uixComponent = (UIXComponent) component;
+
+    if (_attributeChangeListener != null)
+    {
+      uixComponent.setAttributeChangeListener(_attributeChangeListener);
+    }
+
+    setProperties(uixComponent.getFacesBean());
+  }
+
+  protected void setProperty(
+    FacesBean   bean,
+    PropertyKey key,
+    ValueExpression expression)
+  {
+    if (expression == null)
+      return;
+
+    if (expression.isLiteralText())
+    {
+      bean.setProperty(key, expression.getValue(null));
+    }
+    else
+    {
+      bean.setValueExpression(key, expression);
+    }
+  }
+
+  /**
+   * Set a property of type java.lang.String[].  If the value
+   * is an EL expression, it will be stored as a ValueBinding.
+   * Otherwise, it will parsed as a whitespace-separated series
+   * of strings.
+   * Null values are ignored.
+   */
+  protected void setStringArrayProperty(
+    FacesBean       bean,
+    PropertyKey     key,
+    ValueExpression expression)
+  {
+    if (expression == null)
+      return;
+
+    if (expression.isLiteralText())
+    {
+      bean.setProperty(key, expression.getValue(null));
+    }
+    else
+    {
+      bean.setValueExpression(key, expression);
+    }
+  }
+
+  /**
+   * Set a property of type int[].  If the value
+   * is an EL expression, it will be stored as a ValueBinding.
+   * Otherwise, it will parsed as a whitespace-separated series
+   * of ints.
+   * Null values are ignored.
+   */
+  protected void setIntArrayProperty(
+    FacesBean   bean,
+    PropertyKey key,
+    ValueExpression expression)
+  {
+    if (expression == null)
+      return;
+
+    if (expression.isLiteralText())
+    {
+      Object value = expression.getValue(null);
+      if (value != null)
+      {
+        String[] strings = _parseNameTokens(value);
+        final int[] ints;
+        if (strings != null)
+        {
+          try
+          {
+            ints = new int[strings.length];
+            for(int i=0; i<strings.length; i++)
+            {
+              int j = Integer.parseInt(strings[i]);
+              ints[i] = j;
+            }
+          }
+          catch (NumberFormatException e)
+          {
+            _LOG.severe("Could not convert:"+value+" into int[]", e);
+            return;
+          }
+
+          bean.setProperty(key, ints);
+        }
+      }
+    }
+    else
+    {
+      bean.setValueExpression(key, expression);
+    }
+  }
+
+  /**
+   * Set a property of type java.util.Date.  If the value
+   * is an EL expression, it will be stored as a ValueBinding.
+   * Otherwise, it will parsed as an ISO 8601 date (yyyy-MM-dd).
+   * Null values are ignored.
+   */
+  protected void setDateProperty(
+    FacesBean   bean,
+    PropertyKey key,
+    ValueExpression expression)
+  {
+    if (expression == null)
+      return;
+
+    if (expression.isLiteralText())
+    {
+      bean.setProperty(key, _parseISODate(expression.getValue(null)));
+    }
+    else
+    {
+      bean.setValueExpression(key, expression);
+    }
+  }
+
+
+  protected void setProperties(FacesBean bean)
+  {
+    // Could be abstract, but it's easier to *always* call super.setProperties(),
+    // and perhaps we'll have something generic in here, esp. if we take
+    // over "rendered" from UIComponentTag
+  }
+
+  /**
+   * Sets any fatal validation error that could have happened during property
+   *  setting. If this is set, tag execution aborts with a JspException at the
+   *  end of doStartTag().
+   * @param validationError
+   */
+  protected void setValidationError(String validationError)
+  {
+    _validationError = validationError;
+  }
+
+  /**
+   * Parse a string into a java.util.Date object.  The
+   * string must be in ISO 9601 format (yyyy-MM-dd).
+   */
+  static private final Date _parseISODate(Object o)
+  {
+    if (o == null)
+      return null;
+
+    String stringValue = o.toString();
+    try
+    {
+      return _ISO_DATE_FORMAT.parse(stringValue);
+    }
+    catch (ParseException pe)
+    {
+      _LOG.info("Could not parse value {0} into a Date using " +
+                "pattern \"yyyy-MM-dd\";  ignoring.", stringValue);
+      return null;
+    }
+  }
+
+  /**
+   * Parses a whitespace separated series of name tokens.
+   * @param stringValue the full string
+   * @return an array of each constituent value, or null
+   *  if there are no tokens (that is, the string is empty or
+   *  all whitespace)
+   * @todo Move to utility function somewhere (ADF Share?)
+   */
+  static private final String[] _parseNameTokens(Object o)
+  {
+    if (o == null)
+      return null;
+
+    String stringValue = o.toString();
+    ArrayList<String> list = new ArrayList<String>(5);
+
+    int     length = stringValue.length();
+    boolean inSpace = true;
+    int     start = 0;
+    for (int i = 0; i < length; i++)
+    {
+      char ch = stringValue.charAt(i);
+
+      // We're in whitespace;  if we've just departed
+      // a run of non-whitespace, append a string.
+      // Now, why do we use the supposedly deprecated "Character.isSpace()"
+      // function instead of "isWhitespace"?  We're following XML rules
+      // here for the meaning of whitespace, which specifically
+      // EXCLUDES general Unicode spaces.
+      if (Character.isWhitespace(ch))
+      {
+        if (!inSpace)
+        {
+          list.add(stringValue.substring(start, i));
+          inSpace = true;
+        }
+      }
+      // We're out of whitespace;  if we've just departed
+      // a run of whitespace, start keeping track of this string
+      else
+      {
+        if (inSpace)
+        {
+          start = i;
+          inSpace = false;
+        }
+      }
+    }
+
+    if (!inSpace)
+      list.add(stringValue.substring(start));
+
+    if (list.isEmpty())
+      return null;
+
+    return list.toArray(new String[list.size()]);
+  }
+
+  private static void _applyChanges(
+    FacesContext facesContext,
+    UIComponent uiComponent,
+    boolean isCreated)
+  {
+    RequestContext afc = RequestContext.getCurrentInstance();
+    Iterator<ComponentChange> changeIter =
+                  afc.getChangeManager().getComponentChanges(facesContext, uiComponent);
+
+    if (changeIter == null)
+      return;
+    while (changeIter.hasNext())
+    {
+      ComponentChange change = changeIter.next();
+
+      //pu: If we did not create the component during tag execution, do not
+      //  apply any AttributeChange. This is because we do not have enough
+      //  mechanism to take care of such cases for now. Users could always apply
+      //  such Changes explicitly in their backing bean after creating component.
+      boolean isChangeApplicable =
+        ( (change instanceof AttributeComponentChange) && !isCreated) ? false:true;
+
+      if (isChangeApplicable)
+      {
+        change.changeComponent(uiComponent);
+      }
+
+      //pu: In case this Change has added a new component/facet, the added
+      //  component could have its own Changes, that may need to be applied here.
+      if (change instanceof AddComponentChange)
+      {
+        UIComponent newAddedComponent =
+          ( (AddComponentChange)change ).getComponent();
+
+        if (newAddedComponent != null)
+        {
+          _applyChanges(facesContext, newAddedComponent, true);
+        }
+      }
+    }
+  }
+
+  private static final TrinidadLogger _LOG = TrinidadLogger.createTrinidadLogger(UIXComponentTag.class);
+
+  // We rely strictly on ISO 8601 formats
+  private static DateFormat  _ISO_DATE_FORMAT =
+    new SimpleDateFormat("yyyy-MM-dd");
+
+  private MethodExpression  _attributeChangeListener;
+  private String            _validationError;
+}

Modified: incubator/adffaces/branches/faces-1_2/trinidad/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/components/trinidad/ComponentBase.xml
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/trinidad/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/components/trinidad/ComponentBase.xml?view=diff&rev=453091&r1=453090&r2=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/trinidad/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/components/trinidad/ComponentBase.xml (original)
+++ incubator/adffaces/branches/faces-1_2/trinidad/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/components/trinidad/ComponentBase.xml Wed Oct  4 19:51:35 2006
@@ -42,7 +42,7 @@
     </property>
     <component-extension>
       <mfp:component-supertype>javax.faces.Component</mfp:component-supertype>
-      <mfp:tag-class>org.apache.myfaces.trinidad.webapp.UIXComponentTag</mfp:tag-class>
+      <mfp:tag-class>org.apache.myfaces.trinidad.webapp.UIXComponentELTag</mfp:tag-class>
       <mfp:component-class-modifier>abstract</mfp:component-class-modifier>
       <mfp:event>
         <mfp:event-type>org.apache.myfaces.trinidad.AttributeChange</mfp:event-type>

Modified: incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/pom.xml
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/pom.xml?view=diff&rev=453091&r1=453090&r2=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/pom.xml (original)
+++ incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/pom.xml Wed Oct  4 19:51:35 2006
@@ -95,6 +95,7 @@
           <faceletHandlerClass>org.apache.myfaces.trinidadinternal.facelets.TrinidadComponentHandler</faceletHandlerClass>
           <typePrefix>org.apache</typePrefix>
           <packageContains>org.apache</packageContains>
+          <jsfVersion>1.2</jsfVersion>
           <force>true</force>
         </configuration>
         <executions>

Modified: incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/conf/META-INF/tr-base.tld
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/conf/META-INF/tr-base.tld?view=diff&rev=453091&r1=453090&r2=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/conf/META-INF/tr-base.tld (original)
+++ incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/conf/META-INF/tr-base.tld Wed Oct  4 19:51:35 2006
@@ -14,73 +14,73 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 -->
-<!DOCTYPE taglib 
-   PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
-          "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
-<taglib>
+<taglib
+  xmlns="http://java.sun.com/xml/ns/javaee"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
+  version="2.1">
+
+  <display-name>Apache Trinidad Core</display-name>    
   <tlib-version>11-m3</tlib-version>
-  <jsp-version>1.2</jsp-version>
   <short-name>tr</short-name>
   <uri>http://myfaces.apache.org/trinidad</uri>
-  <display-name>Apache Trinidad Core</display-name>    
         
     <tag>
-      <name>attribute</name>   
-      <tag-class>org.apache.myfaces.trinidadinternal.taglib.AttributeTag</tag-class>
-      <body-content>empty</body-content>
       <description>
         The Attribute tag adds a property with the specified name and value 
         to the component associated with the parent tag.  It behaves the same
         as the JSF Attribute tag except that it creates a value binding for 
         expressions instead of immediately evaluating it.  
       </description>
+      <name>attribute</name>   
+      <tag-class>org.apache.myfaces.trinidadinternal.taglib.AttributeTag</tag-class>
+      <body-content>empty</body-content>
       <attribute>
-        <name>name</name>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           the name of the attribute
         </description>
+        <name>name</name>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
       <attribute>
-        <name>value</name>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           the value of the attribute
         </description>
+        <name>value</name>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
     </tag>
     
 
     <tag>
-      <name>validator</name>   
-      <tag-class>org.apache.myfaces.trinidadinternal.taglib.ValidatorTag</tag-class>
-      <body-content>empty</body-content>
       <description>
         The Validator tag adds a new validator instance to the component
         associated with the parent tag. The new validator instance is found
         by evaluating a binding expression, or looking up a validator ID.
         This implements the JSF 1.2 definition of &lt;f:validator&gt;.
       </description>
+      <name>validator</name>   
+      <tag-class>org.apache.myfaces.trinidadinternal.taglib.ValidatorTag</tag-class>
+      <body-content>empty</body-content>
       <attribute>
-        <name>validatorId</name>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           the ID of a validator instance registered in faces-config.xml
         </description>
+        <name>validatorId</name>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
       <attribute>
-        <name>binding</name>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           the value binding expression to a property that returns a
           ValidatorInstance.
         </description>
+        <name>binding</name>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
     </tag>        
 
    <tag>
       <name>forEach</name>
-      <tag-class>org.apache.myfaces.trinidadinternal.taglib.ForEachTag</tag-class>
       <description>
 The forEach tag is a replacement for the JSTL &amp;lt;c:forEach&amp;gt; tag
                 that works with Apache Trinidad components.  Today, &amp;lt;c:forEach&amp;gt; cannot
@@ -98,116 +98,115 @@
         &lt;/ul&gt;
       </description>
 
+      <tag-class>org.apache.myfaces.trinidadinternal.taglib.ForEachTag</tag-class>
       <attribute>
-        <name>items</name>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           the items over which iteration takes place 
         </description>
+        <name>items</name>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
 
       <attribute>
-        <name>var</name>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           the name of the variable to expose
         </description>
+        <name>var</name>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
 
       <attribute>
-        <name>varStatus</name>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           Name of the exported scoped variable for the
           status of the iteration.
         </description>
+        <name>varStatus</name>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
 
       <attribute>
-        <name>begin</name>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           the beginning index 
         </description>
+        <name>begin</name>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
 
       <attribute>
-        <name>end</name>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           the ending index 
         </description>
+        <name>end</name>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
 
       <attribute>
-        <name>step</name>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           the number of steps per iteration
         </description>
+        <name>step</name>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
 
    </tag>
 
    <tag>
-      <name>setActionListener</name>
-      <tag-class>org.apache.myfaces.trinidadinternal.taglib.listener.SetActionListenerTag</tag-class>
-      <body-content>empty</body-content>
       <description>
         The setActionListener tag provides a declarative syntax for assigning values before an action fires
       </description>
 
+      <name>setActionListener</name>
+      <tag-class>org.apache.myfaces.trinidadinternal.taglib.listener.SetActionListenerTag</tag-class>
+      <body-content>empty</body-content>
       <attribute>
-        <name>to</name>
-        <required>true</required>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           the target for the value;  must be an EL expression
         </description>
+        <name>to</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
 
       <attribute>
-        <name>from</name>
-        <required>true</required>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           the source of the value;  can be an EL expression or a constant value
         </description>
+        <name>from</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
    </tag>
 
    <tag>
-      <name>returnActionListener</name>
-      <tag-class>org.apache.myfaces.trinidadinternal.taglib.listener.ReturnActionListenerTag</tag-class>
-      <body-content>empty</body-content>
       <description>
         The returnActionListener tag is a declarative way to allow an action source to return 
         a value from a dialog or process.
       </description>
+      <name>returnActionListener</name>
+      <tag-class>org.apache.myfaces.trinidadinternal.taglib.listener.ReturnActionListenerTag</tag-class>
+      <body-content>empty</body-content>
 
       <attribute>
-        <name>value</name>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           The value to return as the dialog/process result.
           This can be an EL expression or a constant value.
         </description>
+        <name>value</name>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
    </tag>
 
 
    <tag>
-      <name>resetActionListener</name>
-      <tag-class>org.apache.myfaces.trinidadinternal.taglib.listener.ResetActionListenerTag</tag-class>
-      <body-content>empty</body-content>
       <description>
         The resetActionListener tag provides a declarative syntax for resetting values before an action fires
       </description>
+      <name>resetActionListener</name>
+      <tag-class>org.apache.myfaces.trinidadinternal.taglib.listener.ResetActionListenerTag</tag-class>
+      <body-content>empty</body-content>
    </tag>
  
    <tag>
-      <name>componentRef</name>
-      <tag-class>org.apache.myfaces.trinidadinternal.taglib.ComponentRefTag</tag-class>
       <description> 
 
       The componentRef tag adds declarative components onto the current
@@ -217,69 +216,69 @@
 
       </description>
 
+      <name>componentRef</name>
+      <tag-class>org.apache.myfaces.trinidadinternal.taglib.ComponentRefTag</tag-class>
       <attribute>
-        <name>componentType</name>
-        <required>true</required>
-        <rtexprvalue>false</rtexprvalue>
         <description>
 Identifies which declarative component to use. 
 All the available components must be
 declared in a region-metadata.xml file.
         </description>
+        <name>componentType</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
 
       <attribute>
-        <name>id</name>
-        <required>true</required>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           This ID must be unique within this page. 
         </description>
+        <name>id</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
 
       <attribute>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           A value to pass to the component definition.
         </description>
+        <name>value</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
 
       <attribute>
-        <name>rendered</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           Whether or not this component is rendered.
         </description>
+        <name>rendered</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
 
    </tag>
 
 
     <tag>
-      <name>componentDef</name>   
-      <tag-class>org.apache.myfaces.trinidadinternal.taglib.ComponentDefTag</tag-class>
       <description>
         The componentDef tag is used to define a component. Its primary purpose
 is defining a "var" property so that the definition can refer to attributes
 on this component's usage.
       </description>
+      <name>componentDef</name>   
+      <tag-class>org.apache.myfaces.trinidadinternal.taglib.ComponentDefTag</tag-class>
       <attribute>
-        <name>var</name>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           the variable name to use when referencing attributes, that may be set
           on this new component.
         </description>
+        <name>var</name>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
     </tag>        
 
 
     <tag>
-      <name>facetRef</name>   
-      <tag-class>org.apache.myfaces.trinidadinternal.taglib.FacetRefTag</tag-class>
       <description>
         The facetRef tag is used to copy facets from a component
         and paste them into its
@@ -289,12 +288,14 @@
         &lt;tr:componentDef&gt;. In other words, a single facet cannot be
         used more than once.
       </description>
+      <name>facetRef</name>   
+      <tag-class>org.apache.myfaces.trinidadinternal.taglib.FacetRefTag</tag-class>
       <attribute>
-        <name>facetName</name>
-        <rtexprvalue>false</rtexprvalue>
         <description>
           the facet name to copy
         </description>
+        <name>facetName</name>
+        <rtexprvalue>false</rtexprvalue>
       </attribute>
     </tag>        
 

Modified: incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/conf/META-INF/trh-base.tld
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/conf/META-INF/trh-base.tld?view=diff&rev=453091&r1=453090&r2=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/conf/META-INF/trh-base.tld (original)
+++ incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/conf/META-INF/trh-base.tld Wed Oct  4 19:51:35 2006
@@ -14,13 +14,13 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 -->
-<!DOCTYPE taglib 
-   PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
-          "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
-<taglib>
+<taglib
+  xmlns="http://java.sun.com/xml/ns/javaee"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
+  version="2.1">
+  <display-name>Apache Trinidad HTML</display-name>
   <tlib-version>11-m3</tlib-version>
-  <jsp-version>1.2</jsp-version>
   <short-name>trh</short-name>
   <uri>http://myfaces.apache.org/trinidad/html</uri>
-  <display-name>Apache Trinidad HTML</display-name>
 </taglib>

Modified: incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/binding/AccessKeyBinding.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/binding/AccessKeyBinding.java?view=diff&rev=453091&r1=453090&r2=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/binding/AccessKeyBinding.java (original)
+++ incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/binding/AccessKeyBinding.java Wed Oct  4 19:51:35 2006
@@ -15,8 +15,11 @@
  */
 package org.apache.myfaces.trinidadinternal.binding;
 
-import javax.faces.context.FacesContext;
-import javax.faces.el.ValueBinding;
+import java.io.Serializable;
+
+import javax.el.ValueExpression;
+import javax.el.ELContext;
+import javax.el.PropertyNotWritableException;
 
 import org.apache.myfaces.trinidadinternal.util.nls.StringUtils;
 
@@ -27,25 +30,25 @@
  *
  * @author The Oracle ADF Faces Team
  */
-public class AccessKeyBinding extends ValueBindingAdapter
+public class AccessKeyBinding extends ValueExpression implements Serializable
 {
   /**
    * Constructor purely for serialization.
    */
   public AccessKeyBinding()
   {
-    super(null);
   }
 
-  public AccessKeyBinding(ValueBinding base)
+  public AccessKeyBinding(ValueExpression expr)
   {
-    super(base);
+    _base = expr;
   }
 
+
   @Override
-  public Object getValue(FacesContext context)
+  public Object getValue(ELContext context)
   {
-    Object o = super.getValue(context);
+    Object o = _base.getValue(context);
     if (o == null)
       return null;
 
@@ -58,8 +61,51 @@
   }
 
   @Override
-  public Class<?> getType(FacesContext context)
+  public void setValue(ELContext context, Object value)
+  {
+    throw new PropertyNotWritableException();
+  }
+
+  @Override
+  public Class<?> getType(ELContext context)
+  {
+    return Character.class;
+  }
+
+  @Override
+  public Class<?> getExpectedType()
   {
     return Character.class;
   }
+
+  @Override
+  public boolean isReadOnly(ELContext context)
+  {
+    return true;
+  }
+
+
+  @Override
+  public boolean isLiteralText()
+  {
+    return false;
+  }
+
+  @Override
+  public String getExpressionString()
+  {
+    return null;
+  }
+
+  public int hashCode()
+  {
+    return 0;
+  }
+
+  public boolean equals(Object o)
+  {
+    return (o == this);
+  }
+
+  private ValueExpression _base;
 }

Modified: incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/binding/StripAccessKeyBinding.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/binding/StripAccessKeyBinding.java?view=diff&rev=453091&r1=453090&r2=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/binding/StripAccessKeyBinding.java (original)
+++ incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/binding/StripAccessKeyBinding.java Wed Oct  4 19:51:35 2006
@@ -15,8 +15,11 @@
  */
 package org.apache.myfaces.trinidadinternal.binding;
 
-import javax.faces.context.FacesContext;
-import javax.faces.el.ValueBinding;
+import java.io.Serializable;
+
+import javax.el.ValueExpression;
+import javax.el.ELContext;
+import javax.el.PropertyNotWritableException;
 
 import org.apache.myfaces.trinidadinternal.util.nls.StringUtils;
 
@@ -27,25 +30,18 @@
  *
  * @author The Oracle ADF Faces Team
  */
-public class StripAccessKeyBinding extends ValueBindingAdapter
+public class StripAccessKeyBinding extends ValueExpression implements Serializable
 {
-  /**
-   * Constructor purely for serialization.
-   */
-  public StripAccessKeyBinding()
-  {
-    super(null);
-  }
 
-  public StripAccessKeyBinding(ValueBinding base)
+  public StripAccessKeyBinding(ValueExpression base)
   {
-    super(base);
+    _base = base;
   }
 
   @Override
-  public Object getValue(FacesContext context)
+  public Object getValue(ELContext context)
   {
-    Object o = super.getValue(context);
+    Object o = _base.getValue(context);
     if (o == null)
       return null;
 
@@ -58,8 +54,50 @@
   }
 
   @Override
-  public Class<?> getType(FacesContext context)
+  public void setValue(ELContext context, Object value)
+  {
+    throw new PropertyNotWritableException();
+  }
+
+  @Override
+  public Class<?> getType(ELContext context)
+  {
+    return Character.class;
+  }
+
+  @Override
+  public Class<?> getExpectedType()
+  {
+    return Character.class;
+  }
+
+  @Override
+  public boolean isReadOnly(ELContext context)
   {
-    return String.class;
+    return true;
   }
+
+  @Override
+  public boolean isLiteralText()
+  {
+    return false;
+  }
+
+  @Override
+  public String getExpressionString()
+  {
+    return null;
+  }
+
+  public int hashCode()
+  {
+    return 0;
+  }
+
+  public boolean equals(Object o)
+  {
+    return (o == this);
+  }
+
+  private ValueExpression _base;
 }

Added: incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/util/MethodExpressionMethodBinding.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/util/MethodExpressionMethodBinding.java?view=auto&rev=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/util/MethodExpressionMethodBinding.java (added)
+++ incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/util/MethodExpressionMethodBinding.java Wed Oct  4 19:51:35 2006
@@ -0,0 +1,57 @@
+/*
+ * Copyright  2006 The Apache Software Foundation.
+ * 
+ * Licensed 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.trinidadinternal.taglib.util;
+
+import java.io.Serializable;
+import javax.el.ELException;
+import javax.el.MethodExpression;
+import javax.faces.context.FacesContext;
+import javax.faces.el.EvaluationException;
+import javax.faces.el.MethodBinding;
+
+public class MethodExpressionMethodBinding extends MethodBinding
+                                           implements Serializable
+{
+  public MethodExpressionMethodBinding(MethodExpression expression)
+  {
+    _expression = expression;
+  }
+
+  public String getExpressionString()
+  {
+    return _expression.getExpressionString();
+  }
+
+  public Class getType(FacesContext context)
+  {
+    return _expression.getMethodInfo(context.getELContext()).getReturnType();
+  }
+
+  public Object invoke(FacesContext context, Object[] params) 
+  {
+    try
+    {
+      return _expression.invoke(context.getELContext(), params);
+    }
+    catch (EvaluationException ee)
+    {
+      throw new ELException(ee.getMessage(), ee.getCause());
+    }
+  }
+
+  private MethodExpression _expression;
+}
\ No newline at end of file

Modified: incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/util/VirtualAttributeUtils.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/util/VirtualAttributeUtils.java?view=diff&rev=453091&r1=453090&r2=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/util/VirtualAttributeUtils.java (original)
+++ incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/util/VirtualAttributeUtils.java Wed Oct  4 19:51:35 2006
@@ -15,7 +15,7 @@
  */
 package org.apache.myfaces.trinidadinternal.taglib.util;
 
-import javax.faces.el.ValueBinding;
+import javax.el.ValueExpression;
 
 import org.apache.myfaces.trinidad.bean.PropertyKey;
 import org.apache.myfaces.trinidad.bean.FacesBean;
@@ -53,14 +53,14 @@
 
   public static void setAccessKeyAttribute(
     FacesBean    bean,
-    ValueBinding valueBinding,
+    ValueExpression valueExpression,
     PropertyKey  textKey,
     PropertyKey  accessKeyKey)
   {
-    bean.setValueBinding(accessKeyKey,
-                         new AccessKeyBinding(valueBinding));
-    bean.setValueBinding(textKey,
-                         new StripAccessKeyBinding(valueBinding));
+    bean.setValueExpression(accessKeyKey,
+                            new AccessKeyBinding(valueExpression));
+    bean.setValueExpression(textKey,
+                         new StripAccessKeyBinding(valueExpression));
   }
 
   private VirtualAttributeUtils()

Modified: incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/test/java/org/apache/myfaces/trinidadinternal/taglib/TLDTest.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/test/java/org/apache/myfaces/trinidadinternal/taglib/TLDTest.java?view=diff&rev=453091&r1=453090&r2=453091
==============================================================================
--- incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/test/java/org/apache/myfaces/trinidadinternal/taglib/TLDTest.java (original)
+++ incubator/adffaces/branches/faces-1_2/trinidad/trinidad-impl/src/test/java/org/apache/myfaces/trinidadinternal/taglib/TLDTest.java Wed Oct  4 19:51:35 2006
@@ -29,6 +29,7 @@
 
   public void testAdfFacesCoreValidity() throws Throwable
   {
+    /* TODO: use Schema validation
     URL dtdSource = getClass().getResource("/javax/servlet/jsp/resources/web-jsptaglibrary_1_2.dtd");
     String publicID = 
       "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN";
@@ -36,10 +37,12 @@
     executeValidityTest(dtdSource,
                         publicID,
                         tldSource);
+    */
   }
 
   public void testAdfFacesHtmlValidity() throws Throwable
   {
+    /* TODO: use Schema validation
     URL dtdSource = getClass().getResource("/javax/servlet/jsp/resources/web-jsptaglibrary_1_2.dtd");
     String publicID = 
       "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN";
@@ -47,5 +50,6 @@
     executeValidityTest(dtdSource,
                         publicID,
                         tldSource);
+    */
   }
 }