blob: af7adc10cba7238fe75b4cc36fe5f2ebc4d23fb2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib;
import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.GeneratorHelper;
import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.MethodSignatureBean;
import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* TODO: comment this!
*
* @author Bruno Aranda (latest modification by $Author$)
* @version $Revision$ $Date$
*/
public class TrinidadComponentTagGenerator extends AbstractComponentTagGenerator
{
private boolean _is12;
public TrinidadComponentTagGenerator(boolean is12)
{
_is12 = is12;
}
protected boolean is12()
{
return _is12;
}
protected void addSpecificImports(Set imports,
ComponentBean component)
{
imports.add("org.apache.myfaces.trinidad.bean.FacesBean");
if (_is12)
{
imports.add("javax.el.ValueExpression");
}
Iterator properties = component.properties();
properties = new FilteredIterator(properties, new TagAttributeFilter());
while (properties.hasNext())
{
PropertyBean property = (PropertyBean) properties.next();
String propertyClass = property.getPropertyClass();
String[] propertyClassParams = property.getPropertyClassParameters();
imports.add(component.getComponentClass());
if (GeneratorHelper.isKeyStroke(propertyClass))
{
if (_is12)
imports.add("javax.el.ValueExpression");
else
imports.add("javax.faces.el.ValueBinding");
imports.add("javax.swing.KeyStroke");
}
else if (GeneratorHelper.isAWTKeyStroke(propertyClass))
{
if (_is12)
imports.add("javax.el.ValueExpression");
else
imports.add("javax.faces.el.ValueBinding");
imports.add("java.awt.AWTKeyStroke");
}
else if (GeneratorHelper.isConverter(propertyClass))
{
if (_is12)
imports.add("javax.el.ValueExpression");
else
imports.add("javax.faces.el.ValueBinding");
imports.add("javax.faces.convert.Converter");
}
else if (property.isVirtual())
{
if (_is12)
imports.add("javax.el.ValueExpression");
else
imports.add("javax.faces.el.ValueBinding");
imports.add("org.apache.myfaces.trinidadinternal.taglib.util.VirtualAttributeUtils");
}
else if (GeneratorHelper.isColorList(propertyClass, propertyClassParams) ||
GeneratorHelper.isColor(propertyClass))
{
if (_is12)
imports.add("javax.el.ValueExpression");
else
imports.add("javax.faces.el.ValueBinding");
imports.add("java.text.ParseException");
imports.add("org.apache.myfaces.trinidadinternal.taglib.util.TagUtils");
}
else if (property.isMethodBinding())
{
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");
}
else if (property.isEnum())
{
imports.add(propertyClass);
}
}
}
protected void writePropertyDeclaration(PrettyWriter out,
PropertyBean property) throws IOException
{
String propName = property.getPropertyName();
String fieldPropName = "_" + propName;
String jspPropType = GeneratorHelper.getJspPropertyType(property, _is12);
out.println();
out.println("private " + jspPropType + " " + fieldPropName + ";");
}
protected void writePropertySetter(PrettyWriter out,
PropertyBean property) throws IOException
{
String propName = property.getPropertyName();
String fieldPropName = "_" + propName;
String jspPropName = property.getJspPropertyName();
String propVar = Util.getVariableFromName(propName);
String setMethod = Util.getPrefixedPropertyName("set", jspPropName);
String jspPropType = GeneratorHelper.getJspPropertyType(property, _is12);
out.print("final ");
out.println("public void " + setMethod + "(" + jspPropType + " " + propVar + ")");
out.println("{");
out.indent();
out.println(fieldPropName + " = " + propVar + ";");
out.unindent();
out.println("}");
}
public void writeSetPropertiesMethod(PrettyWriter out,
String componentClass,
ComponentBean component) throws IOException
{
Collection components = new HashSet();
components.add(component);
writeSetPropertiesMethod(out, componentClass, components);
}
public void writeSetPropertiesMethod(PrettyWriter out, String componentClass, Collection components)
throws IOException
{
Collection all = new HashSet();
for (Iterator lIterator = components.iterator(); lIterator.hasNext();)
{
ComponentBean component = (ComponentBean) lIterator.next();
Iterator prop = component.properties();
while (prop.hasNext())
{
all.add(prop.next());
}
}
Iterator properties = all.iterator();
properties = new FilteredIterator(properties, new TagAttributeFilter());
if (properties.hasNext())
{
out.println();
out.println("@Override");
out.println("protected void setProperties(");
out.indent();
out.println("FacesBean bean)");
out.unindent();
out.println("{");
out.indent();
writeSetPropertyMethodBody(out, componentClass, properties);
out.unindent();
out.println("}");
}
}
protected void writeSetPropertyMethodBody(PrettyWriter out,
String componentClass,
Iterator properties) throws IOException
{
out.println("super.setProperties(bean);");
while (properties.hasNext())
{
PropertyBean property = (PropertyBean) properties.next();
_writeSetPropertiesCase(out, componentClass, property);
}
}
private void _writeSetPropertiesCase(
PrettyWriter out,
String componentClass,
PropertyBean property) throws IOException
{
String propName = property.getPropertyName();
String propClass = property.getPropertyClass();
String propVar = "_" + propName;
if (property.isVirtual())
{
_writeVirtualSetMethod(out, componentClass, propName);
}
else if (property.isMethodBinding())
{
_writeSetMethodBinding(out, componentClass, property);
}
else if (property.isMethodExpression())
{
_writeSetMethodExpression(out, componentClass, property);
}
else if (property.isEnum())
{
_writeSetEnum(out, componentClass, property);
}
else if (GeneratorHelper.isKeyStroke(propClass))
{
_writeSetKeyStroke(out, componentClass, propName);
}
else if (GeneratorHelper.isAWTKeyStroke(propClass))
{
_writeSetAWTKeyStroke(out, componentClass, propName);
}
else if (GeneratorHelper.isColorList(propClass, property.getPropertyClassParameters()))
{
_writeSetColor(out, componentClass, propName, true);
}
else if (GeneratorHelper.isColor(propClass))
{
_writeSetColor(out, componentClass, propName, false);
}
else if (GeneratorHelper.isConverter(propClass))
{
_writeSetConverter(out, componentClass, propName);
}
else if (property.isLiteralOnly())
{
_writeSetLiteral(out, componentClass, propName, propClass, propVar);
}
else if ("java.util.Date".equals(propClass))
{
_writeSetDate(out, componentClass, propName, propClass, propVar, property.getUseMaxTime());
}
else //if (_hasPropertySetter(property))
{
_writeSetProperty(out, componentClass, propName, propClass, propVar);
}
// else
// {
// _writeSetValueBinding(out, componentClass, propName, propVar);
// }
}
private void _writeSetLiteral(
PrettyWriter out,
String componentClass,
String propName,
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, propFullClass, propVar);
}
else
{
String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
out.println("bean.setProperty(" +
componentClass + "." + propKey + ", " +
propVar + ");");
}
}
private void _writeSetDate(
PrettyWriter out,
String componentClass,
String propName,
String propFullClass,
String propVar,
boolean useMaxTime)
{
String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
String propClass = Util.getClassFromFullClass(propFullClass);
String boxedClass = Util.getBoxedClass(propClass);
String setProperty = "setProperty";
String propType = boxedClass.replaceAll("\\[\\]", "Array");
if (useMaxTime)
{
setProperty = Util.getPrefixedPropertyName("setMax", propType + "Property");
}
else
{
setProperty = Util.getPrefixedPropertyName("set", propType + "Property");
}
out.println(setProperty + "(bean, " +
componentClass + "." + propKey + ", " +
propVar + ");");
}
private void _writeSetProperty(
PrettyWriter out,
String componentClass,
String propName,
String propFullClass,
String propVar)
{
String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
String propClass = Util.getClassFromFullClass(propFullClass);
String boxedClass = Util.getBoxedClass(propClass);
String setProperty = "setProperty";
if ((!_is12 && !boxedClass.equals(propClass)) ||
GeneratorHelper.isNumber(propFullClass) ||
"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 + ");");
}
private String[] _getAccessKeyPropertyKeys(
String componentClass,
String propName)
{
String[] propKeys = new String[2];
int offset = propName.indexOf("AndAccessKey");
if (offset != -1)
{
String mainProp = propName.substring(0, offset);
propKeys[0] = componentClass + "." +
Util.getConstantNameFromProperty(mainProp, "_KEY");
propKeys[1] = componentClass + "." +
Util.getConstantNameFromProperty("accessKey", "_KEY");
}
return propKeys;
}
private void _writeSetValueBinding(
PrettyWriter out,
String componentClass,
String propName,
String propVar)
{
String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", " +
"createValueBinding(" + propVar + "));");
}
private void _writeVirtualSetMethod(
PrettyWriter out,
String componentClass,
String propName) throws IOException
{
String[] propKeys = _getAccessKeyPropertyKeys(componentClass, propName);
String propVar = "_" + propName;
out.println("if (" + propVar + " != null)");
out.println("{");
out.indent();
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("String s = " + propVar + ".getExpressionString();");
out.println("if (s != null)");
out.indent();
out.println("VirtualAttributeUtils.setAccessKeyAttribute(");
out.indent();
out.println("bean,");
out.println("s,");
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("}");
}
private void _writeSetMethodBinding(
PrettyWriter out,
String componentClass,
PropertyBean property) throws IOException
{
String propName = property.getPropertyName();
String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
String propVar = "_" + propName;
if (_is12)
{
out.println("if (" + propVar + " != null)");
out.indent();
out.println("bean.setProperty(" + componentClass + "." + propKey + ", " +
"new MethodExpressionMethodBinding(" + propVar + "));");
out.unindent();
}
else
{
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
{
// 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("}");
}
}
private void _writeSetMethodExpression(
PrettyWriter out,
String componentClass,
PropertyBean property) throws IOException
{
String propName = property.getPropertyName();
String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
String propVar = "_" + propName;
out.println("bean.setProperty(" + componentClass + "." + propKey + ", " +
propVar + ");");
}
private void _writeSetEnum(
PrettyWriter out,
String componentClass,
PropertyBean property) throws IOException
{
String propName = property.getPropertyName();
String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
String propVar = "_" + propName;
String propClass = Util.getClassFromFullClass(property.getPropertyClass());
if (_is12)
{
out.println("if (" + propVar + " != null)");
out.println("{");
out.indent();
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("String s = " + propVar + ".getExpressionString();");
out.println("if (s != null)");
out.indent();
out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
out.println("Enum.valueOf(" + propClass + ".class,s));");
out.unindent();
out.unindent();
out.println("}");
out.unindent();
out.println("}");
}
else
{
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("Enum.valueOf(" + propClass + ".class," + propVar + "));");
out.unindent();
out.println("}");
out.unindent();
out.println("}");
}
}
private void _writeSetKeyStroke(
PrettyWriter out,
String componentClass,
String propName) throws IOException
{
String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
String propVar = "_" + propName;
if (_is12)
{
out.println("if (" + propVar + " != null)");
out.println("{");
out.indent();
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("String val = " + propVar + ".getExpressionString();");
out.println("if (val != null)");
out.indent();
out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
out.println("\tKeyStroke.getKeyStroke(val));");
out.unindent();
out.unindent();
out.println("}");
out.unindent();
out.println("}");
}
else
{
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("}");
}
}
private void _writeSetAWTKeyStroke(
PrettyWriter out,
String componentClass,
String propName) throws IOException
{
String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
String propVar = "_" + propName;
if (_is12)
{
out.println("if (" + propVar + " != null)");
out.println("{");
out.indent();
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("String val = " + propVar + ".getExpressionString();");
out.println("if (val != null)");
out.indent();
out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
out.println("\tAWTKeyStroke.getAWTKeyStroke(val));");
out.unindent();
out.unindent();
out.println("}");
out.unindent();
out.println("}");
}
else
{
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("\tAWTKeyStroke.getAWTKeyStroke(" + propVar + "));");
out.unindent();
out.println("}");
out.unindent();
out.println("}");
}
}
private void _writeSetColor(
PrettyWriter out,
String componentClass,
String propName,
boolean isList) throws IOException
{
String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
String propVar = "_" + propName;
out.println("if (" + propVar + " != null)");
out.println("{");
out.indent();
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("String s = " + propVar + ".getExpressionString();");
out.println("if (s != null)");
out.indent();
out.println("{");
out.println("try");
out.println("{");
out.indent();
out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
if (isList)
out.println(" TagUtils.getColorList(s));");
else
{
out.println(" TagUtils.getColor(s));");
}
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 + ",");
if (isList)
out.println(" TagUtils.getColorList(" + propVar + "));");
else
out.println(" TagUtils.getColor(" + 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("}");
}
private void _writeSetConverter(
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();
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("String s = " + propVar + ".getExpressionString();");
out.println("if (s != null)");
out.println("{");
out.indent();
out.println("Converter converter = getFacesContext().getApplication().");
out.indent();
out.println("createConverter(s);");
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("}");
}
private boolean isStringMethodBindingReturnType(
MethodSignatureBean sig)
{
return (sig != null && "java.lang.String".equals(sig.getReturnType()));
}
}