org.richfaces.cdk.templatecompiler.statements.HelperMethodFactoryImpl Maven / Gradle / Ivy
The newest version!
/*
* $Id$
*
* License Agreement.
*
* Rich Faces - Natural Ajax for Java Server Faces (JSF)
*
* Copyright (C) 2007 Exadel, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.richfaces.cdk.templatecompiler.statements;
import java.io.IOException;
import java.util.EnumMap;
import java.util.List;
import org.richfaces.cdk.Generator;
import org.richfaces.cdk.Logger;
import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
import org.richfaces.cdk.templatecompiler.TemplateModel;
import org.richfaces.cdk.templatecompiler.builder.model.Argument;
import org.richfaces.cdk.templatecompiler.builder.model.JavaMethod;
import org.richfaces.cdk.templatecompiler.builder.model.JavaModifier;
import org.richfaces.cdk.templatecompiler.el.types.ELType;
import org.richfaces.cdk.templatecompiler.el.types.TypesFactory;
import com.google.common.collect.Maps;
import com.google.inject.Inject;
import com.google.inject.name.Named;
/**
*
*
*
* @author [email protected]
*
*/
public class HelperMethodFactoryImpl implements HelperMethodFactory {
private TypesFactory typesFactory;
@Inject(optional = true)
@Named(Generator.RENDERER_UTILS_CLASS)
private String rendererUtilsClass = "org.richfaces.renderkit.RenderKitUtils";
private FreeMarkerRenderer renderer;
private final EnumMap helperMethods = Maps.newEnumMap(HelperMethod.class);
private final Logger log;
@Inject
public HelperMethodFactoryImpl(Logger log) {
this.log = log;
}
/**
*
* Initialization code. It should be called after field injection, so render kit utils class name should have proper value
* here.
*
*
* @param renderer
* @param typesFactory
*/
@Inject
public void initHelperMethods(@TemplateModel FreeMarkerRenderer renderer, TypesFactory typesFactory) {
this.renderer = renderer;
this.typesFactory = typesFactory;
buildHelperMethod(HelperMethod.EMPTINESS_CHECK, false, "emptiness-check-method", "object");
buildHelperMethod(HelperMethod.EQUALS_CHECK, false, "equals-check-method", "o1", "o2");
buildHelperMethod(HelperMethod.TO_BOOLEAN_CONVERSION, false, "conversion-to-boolean-method", "object");
buildHelperMethod(HelperMethod.TO_INTEGER_CONVERSION, false, "conversion-to-integer-method", "object");
buildHelperMethod(HelperMethod.TO_STRING_CONVERSION, false, "conversion-to-string-method", "object");
buildHelperMethod(HelperMethod.SHOULD_RENDER_ATTRIBUTE, true, "should-render-attribute", "attributeValue");
buildHelperMethod(HelperMethod.RENDER_ATTRIBUTE, true, "render-attribute", "attributeValue").getExceptions().add(
typesFactory.getType(IOException.class));
JavaMethod renderAttributes = buildHelperMethod(HelperMethod.RENDER_ATTRIBUTES_SET, true, "render-attributes-set",
"context", "component");
// TODO - put unknown 'Attributes' class into HelperMethod.
List arguments = renderAttributes.getArguments();
arguments.add(new Argument("attributes", typesFactory.getType("Attributes")));
renderAttributes.getExceptions().add(typesFactory.getType(IOException.class));
buildHelperMethod(HelperMethod.CREATE_ATTRIBUTES, true, "create-attributes");
buildHelperMethod(HelperMethod.ADD_TO_SCRIPT_HASH, true, null);
buildHelperMethod(HelperMethod.ADD_TO_SCRIPT_HASH_ATTRIBUTES, true, null);
buildHelperMethod(HelperMethod.TO_SCRIPT_ARGS, true, null);
buildHelperMethod(HelperMethod.CONCAT, true, null);
buildHelperMethod(HelperMethod.HAS_FACET, true, null);
}
private JavaMethod buildHelperMethod(HelperMethod helperMethod, boolean utilsMethod, String templateName,
String... argumentNames) {
JavaMethod helperJavaMethod;
if (utilsMethod && !RendererUtilsMethod.BUILT_IN.equals(rendererUtilsClass)) {
helperJavaMethod = new RendererUtilsMethod(helperMethod, rendererUtilsClass);
} else {
String[] argumentTypes = helperMethod.getArgumentTypes();
Argument[] arguments = new Argument[argumentNames.length];
for (int i = 0; i < argumentNames.length; i++) {
arguments[i] = new Argument(argumentNames[i], typesFactory.getType(argumentTypes[i]));
}
ELType returnType = typesFactory.getType(helperMethod.getReturnType());
helperJavaMethod = new JavaMethod(helperMethod.getName(), returnType, arguments);
helperJavaMethod.addModifier(JavaModifier.PRIVATE);
helperJavaMethod.addModifier(JavaModifier.STATIC);
helperJavaMethod.setMethodBody(new FreeMarkerTemplateStatementBase(renderer, templateName));
}
helperMethods.put(helperMethod, helperJavaMethod);
return helperJavaMethod;
}
/*
* (non-Javadoc)
*
* @see org.richfaces.cdk.templatecompiler.statements.HelperMethodFactory#getHelperMethod(org.richfaces.cdk.templatecompiler
* .el.HelperMethod)
*/
@Override
public JavaMethod getHelperMethod(HelperMethod helper) {
return helperMethods.get(helper);
}
}