All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.richfaces.cdk.templatecompiler.RendererClassVisitor 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;

import java.io.IOException;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;

import javax.faces.application.ResourceDependencies;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.xml.namespace.QName;

import org.richfaces.cdk.CdkClassLoader;
import org.richfaces.cdk.CdkException;
import org.richfaces.cdk.Logger;
import org.richfaces.cdk.model.ClassName;
import org.richfaces.cdk.model.PropertyBase;
import org.richfaces.cdk.templatecompiler.builder.model.Argument;
import org.richfaces.cdk.templatecompiler.builder.model.JavaAnnotation;
import org.richfaces.cdk.templatecompiler.builder.model.JavaClass;
import org.richfaces.cdk.templatecompiler.builder.model.JavaField;
import org.richfaces.cdk.templatecompiler.builder.model.JavaMethod;
import org.richfaces.cdk.templatecompiler.builder.model.JavaModifier;
import org.richfaces.cdk.templatecompiler.builder.model.JavaStatement;
import org.richfaces.cdk.templatecompiler.el.types.ELType;
import org.richfaces.cdk.templatecompiler.el.types.TypesFactory;
import org.richfaces.cdk.templatecompiler.model.AnyElement;
import org.richfaces.cdk.templatecompiler.model.CdkBodyElement;
import org.richfaces.cdk.templatecompiler.model.CdkCallElement;
import org.richfaces.cdk.templatecompiler.model.CdkCaseElement;
import org.richfaces.cdk.templatecompiler.model.CdkChooseElement;
import org.richfaces.cdk.templatecompiler.model.CdkDefaultElement;
import org.richfaces.cdk.templatecompiler.model.CdkForEachElement;
import org.richfaces.cdk.templatecompiler.model.CdkFragmentElement;
import org.richfaces.cdk.templatecompiler.model.CdkIfElement;
import org.richfaces.cdk.templatecompiler.model.CdkObjectElement;
import org.richfaces.cdk.templatecompiler.model.CdkOtherwiseElement;
import org.richfaces.cdk.templatecompiler.model.CdkRenderFragmentElement;
import org.richfaces.cdk.templatecompiler.model.CdkScriptObjectElement;
import org.richfaces.cdk.templatecompiler.model.CdkScriptOptionElement;
import org.richfaces.cdk.templatecompiler.model.CdkSwitchElement;
import org.richfaces.cdk.templatecompiler.model.CdkWhenElement;
import org.richfaces.cdk.templatecompiler.model.ClassImport;
import org.richfaces.cdk.templatecompiler.model.CompositeImplementation;
import org.richfaces.cdk.templatecompiler.model.CompositeInterface;
import org.richfaces.cdk.templatecompiler.model.CompositeRenderFacet;
import org.richfaces.cdk.templatecompiler.model.ResourceDependency;
import org.richfaces.cdk.templatecompiler.model.Template;
import org.richfaces.cdk.templatecompiler.model.TemplateVisitor;
import org.richfaces.cdk.templatecompiler.statements.AddAttributesToScriptHashStatement;
import org.richfaces.cdk.templatecompiler.statements.AttributesStatement;
import org.richfaces.cdk.templatecompiler.statements.CaseStatement;
import org.richfaces.cdk.templatecompiler.statements.CastComponentStatement;
import org.richfaces.cdk.templatecompiler.statements.ConstantReturnMethodBodyStatement;
import org.richfaces.cdk.templatecompiler.statements.DefineObjectStatement;
import org.richfaces.cdk.templatecompiler.statements.EncodeMethodPrefaceStatement;
import org.richfaces.cdk.templatecompiler.statements.EndElementStatement;
import org.richfaces.cdk.templatecompiler.statements.ForEachStatement;
import org.richfaces.cdk.templatecompiler.statements.HelperMethod;
import org.richfaces.cdk.templatecompiler.statements.HelperMethodFactory;
import org.richfaces.cdk.templatecompiler.statements.IfElseStatement;
import org.richfaces.cdk.templatecompiler.statements.IfStatement;
import org.richfaces.cdk.templatecompiler.statements.RenderFacetStatement;
import org.richfaces.cdk.templatecompiler.statements.RenderFragmentStatement;
import org.richfaces.cdk.templatecompiler.statements.ScriptObjectStatement;
import org.richfaces.cdk.templatecompiler.statements.ScriptOptionStatement;
import org.richfaces.cdk.templatecompiler.statements.StartElementStatement;
import org.richfaces.cdk.templatecompiler.statements.StatementsContainer;
import org.richfaces.cdk.templatecompiler.statements.SwitchStatement;
import org.richfaces.cdk.templatecompiler.statements.TemplateStatement;
import org.richfaces.cdk.templatecompiler.statements.TemplateStatementImpl;
import org.richfaces.cdk.templatecompiler.statements.WriteTextStatement;
import org.richfaces.cdk.util.Strings;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.inject.Injector;

/**
 * 

*

* * @author [email protected] * @author Brian Leathem * @author Lukas Fryc */ public class RendererClassVisitor implements TemplateVisitor { /** * */ // TODO externalize public static final String RENDER_KIT_UTILS_CLASS_NAME = "org.richfaces.renderkit.RenderKitUtils"; public static final String RENDERER_BASE_CLASS_NAME = "org.richfaces.renderkit.RendererBase"; /** * */ public static final String RESPONSE_WRITER_VARIABLE = "responseWriter"; /** * */ public static final String COMPONENT_VARIABLE = "component"; /** * */ public static final String COMPONENT_PARAMETER = "uiComponent"; /** * */ public static final String THIS_VARIABLE = "this"; /** * */ public static final String SUPER_VARIABLE = "super"; /** * */ public static final String FACES_CONTEXT_VARIABLE = "facesContext"; public static final ImmutableMap ENCODE_METHOD_VARIABLES = ImmutableMap.builder() .put("facesContextVariable", RendererClassVisitor.FACES_CONTEXT_VARIABLE) .put("componentVariable", RendererClassVisitor.COMPONENT_VARIABLE) .put("responseWriterVariable", RendererClassVisitor.RESPONSE_WRITER_VARIABLE) .put("clientIdVariable", RendererClassVisitor.CLIENT_ID_VARIABLE).build(); /** * */ static final String CLIENT_ID_VARIABLE = "clientId"; private final Logger log; private final Injector injector; private final TypesFactory typesFactory; private final HelperMethodFactory helperMethodFactory; private final CompositeInterface compositeInterface; private final Collection attributes; private StatementsContainer currentStatement; private JavaClass generatedClass; private ClassName componentBaseClass; private ClassName rendererSuperClass; private boolean isExtendingRendererBase = false; private Set addedHelperMethods = EnumSet.noneOf(HelperMethod.class); private CdkClassLoader loader; private FragmentStore fragmentStore; public RendererClassVisitor(CompositeInterface compositeInterface, Collection attributes, Logger log, Injector injector, TypesFactory typesFactory, HelperMethodFactory helperFactory, CdkClassLoader loader) { this.compositeInterface = compositeInterface; this.attributes = attributes; this.injector = injector; this.typesFactory = typesFactory; this.log = log; this.helperMethodFactory = helperFactory; this.loader = loader; this.fragmentStore = new FragmentStore(); this.injector.injectMembers(this.fragmentStore); } private void initializeJavaClass() { this.generatedClass = new JavaClass(compositeInterface.getJavaClass()); this.generatedClass.addModifier(JavaModifier.PUBLIC); this.rendererSuperClass = compositeInterface.getBaseClass(); if (null != this.rendererSuperClass) { this.generatedClass.setSuperClass(this.rendererSuperClass); this.isExtendingRendererBase = isExtendingRendererBase(); } this.componentBaseClass = compositeInterface.getComponentBaseClass(); if (null == this.componentBaseClass) { this.componentBaseClass = new ClassName(UIComponent.class.getName()); } this.generatedClass.addImport(FacesContext.class); this.generatedClass.addImport(ResponseWriter.class); this.generatedClass.addImport(UIComponent.class); for (ClassImport classImport : compositeInterface.getClassImports()) { List importedNames = classImport.getNames(); if (importedNames == null || importedNames.isEmpty()) { importedNames = Lists.newArrayList("*"); } for (String importedName : importedNames) { this.generatedClass.addImport(Strings.DOT_JOINER.join(classImport.getPackage(), importedName), classImport.isStatic()); } } // TODO - make this JavaDoc - Generated annotation is present since JDK6 // this.generatedClass.addAnnotation(Generated.class, "\"RichFaces CDK\""); // TODO remove this after improving Java model // this.generatedClass.addImport(Generated.class); List resourceDependencies = compositeInterface.getResourceDependencies(); ELType dependencyType = typesFactory.getType(javax.faces.application.ResourceDependency.class); if (1 == resourceDependencies.size()) { ResourceDependency resource = resourceDependencies.get(0); this.generatedClass.addAnnotation(createResourceAnnotation(dependencyType, resource)); } else if (resourceDependencies.size() > 1) { StringBuilder resources = new StringBuilder("{"); for (ResourceDependency resource : resourceDependencies) { if (resources.length() > 1) { resources.append(','); } resources.append("@ResourceDependency("); resources.append("name=\"").append(resource.getName()).append("\",library=\"").append(resource.getLibrary()) .append("\",target=\"").append(resource.getTarget()).append("\"").append(")"); } resources.append("}"); this.generatedClass.addAnnotation(new JavaAnnotation(typesFactory.getType(ResourceDependencies.class), resources .toString())); this.generatedClass.addImport(javax.faces.application.ResourceDependency.class); } this.createMethodContext(); } private boolean isExtendingRendererBase() { try { Class rendererSuperType = loader.loadClass(rendererSuperClass.getFullName()); Class rendererBaseType = loader.loadClass(RENDERER_BASE_CLASS_NAME); return rendererBaseType.isAssignableFrom(rendererSuperType); } catch (ClassNotFoundException e) { log.warn("Could not determine if the renderer-base-class extends " + RENDERER_BASE_CLASS_NAME + ": " + e.getMessage()); return false; } } private JavaAnnotation createResourceAnnotation(ELType dependencyType, ResourceDependency resource) { return new JavaAnnotation(dependencyType, "name=\"" + resource.getName() + "\"", "library=\"" + resource.getLibrary() + "\"", "target=\"" + resource.getTarget() + "\""); } private void addHelperMethod(HelperMethod helperMethod) { if (addedHelperMethods.add(helperMethod)) { JavaMethod helperJavaMethod = helperMethodFactory.getHelperMethod(helperMethod); if (helperJavaMethod.isHidden()) { generatedClass.addImports(helperJavaMethod.getRequiredImports()); } else { generatedClass.addMethod(helperJavaMethod); } addHelperMethods(helperJavaMethod.getMethodBody()); } } private void addHelperMethods(JavaStatement statement) { if (statement instanceof TemplateStatement) { TemplateStatement templateStatement = (TemplateStatement) statement; for (HelperMethod helper : templateStatement.getRequiredMethods()) { addHelperMethod(helper); } } } private ELType getType(Class type) { // get type by name in order to get the class instance from CDK class loader return typesFactory.getType(type.getName()); } private void createMethodContext() { this.currentStatement = new StatementsContainer(); currentStatement.setVariable(FACES_CONTEXT_VARIABLE, getType(FacesContext.class)); currentStatement.setVariable(RESPONSE_WRITER_VARIABLE, getType(ResponseWriter.class)); currentStatement.setVariable(CLIENT_ID_VARIABLE, getType(String.class)); ELType componentBaseClassType = typesFactory.getType(componentBaseClass.getName()); currentStatement.setVariable(COMPONENT_VARIABLE, componentBaseClassType); ELType generatedClassSuperType = typesFactory.getType(generatedClass.getSuperClass().getName()); currentStatement.setVariable(SUPER_VARIABLE, generatedClassSuperType); ELType generatedClassType = typesFactory.getGeneratedType(generatedClass.getName(), generatedClassSuperType); currentStatement.setVariable(THIS_VARIABLE, generatedClassType); } private void flushToMethod(String methodName, boolean enforce, boolean override, Collection additionaArguments) { if (enforce || !this.currentStatement.isEmpty()) { Argument facesContextArgument = new Argument(FACES_CONTEXT_VARIABLE, getType(FacesContext.class)); Argument responseWriterArgument = new Argument(RESPONSE_WRITER_VARIABLE, getType(ResponseWriter.class)); Argument componentArgument; int statementCount = 0; if (null != compositeInterface.getComponentBaseClass()) { ELType type = typesFactory.getType(compositeInterface.getComponentBaseClass().getName()); componentArgument = new Argument(COMPONENT_PARAMETER, getType(UIComponent.class)); CastComponentStatement statement = createStatement(CastComponentStatement.class); statement.setType(type); statement.setComponentParameter(COMPONENT_PARAMETER); currentStatement.addStatement(statementCount, statement); statementCount++; } else { componentArgument = new Argument(COMPONENT_VARIABLE, getType(UIComponent.class)); } List arguments = Lists.newLinkedList(); if (this.isExtendingRendererBase) { arguments.add(responseWriterArgument); } arguments.add(facesContextArgument); arguments.add(componentArgument); arguments.addAll(additionaArguments); JavaMethod javaMethod = new JavaMethod(methodName, arguments); javaMethod.addModifier(JavaModifier.PUBLIC); javaMethod.getExceptions().add(getType(IOException.class)); if (override) { javaMethod.addAnnotation(new JavaAnnotation(getType(Override.class))); } EncodeMethodPrefaceStatement encodeMethodPreface = createStatement(EncodeMethodPrefaceStatement.class); encodeMethodPreface.setRenderResponseWriter(!this.isExtendingRendererBase); currentStatement.addStatement(statementCount, encodeMethodPreface); javaMethod.setMethodBody(currentStatement); addHelperMethods(currentStatement); for (JavaField field : currentStatement.getRequiredFields()) { generatedClass.addField(field); } generatedClass.addMethod(javaMethod); } } private void flushToEncodeMethod(String encodeMethodName, boolean enforce) { flushToMethod(encodeMethodName, enforce, true, Collections.EMPTY_LIST); createMethodContext(); } private void createRendersChildrenMethod() { Boolean rendersChildren = compositeInterface.getRendersChildren(); if (rendersChildren != null) { JavaMethod rendersChildrenMethod = new JavaMethod("getRendersChildren", TypesFactory.BOOLEAN_TYPE); rendersChildrenMethod.addModifier(JavaModifier.PUBLIC); rendersChildrenMethod.addAnnotation(new JavaAnnotation(getType(Override.class))); ConstantReturnMethodBodyStatement statement = createStatement(ConstantReturnMethodBodyStatement.class); statement.setReturnValue(Boolean.toString(compositeInterface.getRendersChildren())); rendersChildrenMethod.setMethodBody(statement); generatedClass.addMethod(rendersChildrenMethod); } } private T createStatement(Class statementClass) { return this.injector.getInstance(statementClass); } protected void pushStatement(StatementsContainer container) { addStatement(container); currentStatement = container; } protected T pushStatement(Class container) { T statement = createStatement(container); pushStatement(statement); return statement; } protected void popStatement() { currentStatement = currentStatement.getParent(); } protected T addStatement(Class statementClass) { T statement = createStatement(statementClass); addStatement(statement); return statement; } protected void addStatement(TemplateStatement statement) { currentStatement.addStatement(statement); } /** *

*

* * @return the rendererClass */ public JavaClass getGeneratedClass() { return this.generatedClass; } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #startElement(org.richfaces.cdk.templatecompiler.model.CdkBodyElement) */ @Override public void startElement(CdkBodyElement cdkBodyElement) throws CdkException { if (this.isExtendingRendererBase) { flushToEncodeMethod("doEncodeBegin", false); } else { flushToEncodeMethod("encodeBegin", false); } } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #endElement(org.richfaces.cdk.templatecompiler.model.CdkBodyElement) */ @Override public void endElement(CdkBodyElement cdkBodyElement) throws CdkException { if (this.isExtendingRendererBase) { flushToEncodeMethod("doEncodeChildren", cdkBodyElement.isEnforce()); } else { flushToEncodeMethod("encodeChildren", cdkBodyElement.isEnforce()); } } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #startElement(org.richfaces.cdk.templatecompiler.model.AnyElement) */ @Override public void startElement(AnyElement anyElement) throws CdkException { QName elementName = anyElement.getName(); if (Template.isDirectiveNamespace(elementName)) { log.error("Unknown directive element " + elementName); } else { StartElementStatement startElementStatement = addStatement(StartElementStatement.class); startElementStatement.setElementName(elementName); AttributesStatement attributesStatement = addStatement(AttributesStatement.class); attributesStatement.processAttributes(anyElement, attributes); } } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #endElement(org.richfaces.cdk.templatecompiler.model.AnyElement) */ @Override public void endElement(AnyElement anyElement) throws CdkException { QName elementName = anyElement.getName(); EndElementStatement endElementStatement = addStatement(EndElementStatement.class); endElementStatement.setElementName(elementName); } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#visitElement(java.lang.String) */ @Override public void visitElement(String text) throws CdkException { if (text != null) { String trimmedText = text.trim(); if (trimmedText.length() > 0) { WriteTextStatement statement = addStatement(WriteTextStatement.class); statement.setExpression(trimmedText); } } } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #visitElement(org.richfaces.cdk.templatecompiler.model.CdkCallElement) */ @Override public void visitElement(CdkCallElement cdkCallElement) throws CdkException { String expression = cdkCallElement.getExpression(); if (Strings.isEmpty(expression)) { expression = cdkCallElement.getBodyValue(); } addStatement(new TemplateStatementImpl(expression + ";")); } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #startElement(org.richfaces.cdk.templatecompiler.model.CdkIfElement) */ @Override public void startElement(CdkIfElement cdkIfElement) { pushStatement(IfElseStatement.class); IfStatement ifStatement = pushStatement(IfStatement.class); ifStatement.setTest(cdkIfElement.getTest()); } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #endElement(org.richfaces.cdk.templatecompiler.model.CdkIfElement) */ @Override public void endElement(CdkIfElement cdkIfElement) { popStatement(); popStatement(); } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #startElement(org.richfaces.cdk.templatecompiler.model.CdkChooseElement) */ @Override public void startElement(CdkChooseElement cdkChooseElement) { pushStatement(IfElseStatement.class); } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #endElement(org.richfaces.cdk.templatecompiler.model.CdkChooseElement) */ @Override public void endElement(CdkChooseElement cdkChooseElement) { popStatement(); } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #startElement(org.richfaces.cdk.templatecompiler.model.CdkWhenElement) */ @Override public void startElement(CdkWhenElement cdkWhenElement) { IfStatement ifStatement = pushStatement(IfStatement.class); ifStatement.setTest(cdkWhenElement.getTest()); } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #endElement(org.richfaces.cdk.templatecompiler.model.CdkWhenElement) */ @Override public void endElement(CdkWhenElement cdkWhenElement) { popStatement(); } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #startElement(org.richfaces.cdk.templatecompiler.model.CdkOtherwiseElement) */ @Override public void startElement(CdkOtherwiseElement cdkOtherwiseElement) { pushStatement(StatementsContainer.class); } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #endElement(org.richfaces.cdk.templatecompiler.model.CdkOtherwiseElement) */ @Override public void endElement(CdkOtherwiseElement cdkOtherwiseElement) { popStatement(); } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #visitElement(org.richfaces.cdk.templatecompiler.model.CdkObjectElement) */ @Override public void visitElement(CdkObjectElement cdkObjectElement) { String name = cdkObjectElement.getName(); String value = cdkObjectElement.getValue(); if (Strings.isEmpty(value)) { value = cdkObjectElement.getBodyValue(); } String type = cdkObjectElement.getType(); DefineObjectStatement statement = addStatement(DefineObjectStatement.class); statement.setObject(name, type, value, cdkObjectElement.isCast()); currentStatement.setVariable(name, statement.getType()); } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #startElement(org.richfaces.cdk.templatecompiler.model.CdkForEachElement) */ @Override public void startElement(CdkForEachElement cdkForEachElement) { String items = cdkForEachElement.getItems(); // String itemsExpression = compileEl(items, Iterable.class); // TODO - review // Class collectionElementClass = lastCompiledExpressionType.getContainerType().getRawType(); // if (collectionElementClass == null) { // collectionElementClass = Object.class; // } String var = cdkForEachElement.getVar(); String varStatus = cdkForEachElement.getVarStatus(); Integer begin = cdkForEachElement.getBegin(); Integer end = cdkForEachElement.getEnd(); Integer step = cdkForEachElement.getStep(); ForEachStatement forEachStatement = pushStatement(ForEachStatement.class); forEachStatement.setItemsExpression(items, var, varStatus, begin, end, step); // currentStatement.setVariable(cdkForEachElement.getVar(), lastCompiledExpressionType.getContainerType()); } /* * (non-Javadoc) * * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor * #endElement(org.richfaces.cdk.templatecompiler.model.CdkForEachElement) */ @Override public void endElement(CdkForEachElement cdkForEachElement) { popStatement(); } @Override public void startElement(CdkSwitchElement cdkSwitchElement) { String key = cdkSwitchElement.getKey(); // String keyExpression = compileEl(key, Object.class); SwitchStatement switchStatement = pushStatement(SwitchStatement.class); switchStatement.setKeyExpression(key); } @Override public void endElement(CdkSwitchElement cdkSwitchElement) { popStatement(); } @Override public void startElement(CdkCaseElement cdkCaseElement) { CaseStatement caseStatement = pushStatement(CaseStatement.class); caseStatement.setValues(cdkCaseElement.getValues()); } @Override public void endElement(CdkCaseElement cdkCaseElement) { popStatement(); } @Override public void startElement(CdkDefaultElement cdkDefaultElement) { pushStatement(CaseStatement.class); } @Override public void endElement(CdkDefaultElement cdkDefaultElement) { popStatement(); } /** * */ public void preProcess(CompositeImplementation impl) { initializeJavaClass(); } @Override public void startElement(CompositeRenderFacet compositeRenderFacetElement) throws CdkException { RenderFacetStatement renderFacetStatement = pushStatement(RenderFacetStatement.class); renderFacetStatement.setName(compositeRenderFacetElement.getName()); } @Override public void endElement(CompositeRenderFacet compositeRenderFacetElement) throws CdkException { popStatement(); } /** * */ public void postProcess(CompositeImplementation impl) { if (this.isExtendingRendererBase) { flushToEncodeMethod("doEncodeEnd", false); } else { flushToEncodeMethod("encodeEnd", false); } createRendersChildrenMethod(); } @Override public void startElement(CdkScriptObjectElement cdkScriptObjectElement) { ScriptObjectStatement scriptObjectStatement = pushStatement(ScriptObjectStatement.class); scriptObjectStatement.setObject(cdkScriptObjectElement.getName(), cdkScriptObjectElement.getBase()); } @Override public void endElement(CdkScriptObjectElement cdkScriptObjectElement) { popStatement(); } private void addScriptHashAttributesPassthroughStatement(List attributeNames, String wrapper) { if (attributeNames == null || attributeNames.isEmpty()) { return; } AddAttributesToScriptHashStatement statement = addStatement(AddAttributesToScriptHashStatement.class); statement.setWrapper(wrapper); statement.setAttributes(attributeNames, attributes); } private void addScriptOptionStatement(String name, String value, String defaultValue, String wrapper) { ScriptOptionStatement scriptOptionStatement = addStatement(ScriptOptionStatement.class); scriptOptionStatement.setName(name); scriptOptionStatement.setValueExpression(value); scriptOptionStatement.setDefaultValue(defaultValue); scriptOptionStatement.setWrapper(wrapper); } @Override public void visitElement(CdkScriptOptionElement cdkScriptOptionElement) { addScriptHashAttributesPassthroughStatement(cdkScriptOptionElement.getAttributes(), cdkScriptOptionElement.getWrapper()); for (String variableName : cdkScriptOptionElement.getVariables()) { addScriptOptionStatement(variableName, MessageFormat.format("#'{'{0}'}'", variableName), cdkScriptOptionElement.getDefaultValue(), cdkScriptOptionElement.getWrapper()); } if (!Strings.isEmpty(cdkScriptOptionElement.getName())) { addScriptOptionStatement(cdkScriptOptionElement.getName(), cdkScriptOptionElement.getValue(), cdkScriptOptionElement.getDefaultValue(), cdkScriptOptionElement.getWrapper()); } } @Override public void preProcess(CdkFragmentElement fragmentElement) { Fragment fragment = fragmentStore.addFragment(fragmentElement); this.createMethodContext(); for (Argument argument : fragment.getAllArguments()) { currentStatement.setVariable(argument.getName(), argument.getType()); } } @Override public void postProcess(CdkFragmentElement fragmentElement) { Fragment fragment = fragmentStore.getFragment(fragmentElement.getName()); flushToMethod(fragment.getMethodName(), true, false, fragment.getAllArguments()); this.createMethodContext(); } @Override public void visitElement(CdkRenderFragmentElement renderFragmentElement) throws CdkException { RenderFragmentStatement statement = addStatement(RenderFragmentStatement.class); statement.setMethodName(renderFragmentElement.getName()); statement.setAttributes(renderFragmentElement.getAttributes()); statement.setFragmentStore(this.fragmentStore); statement.setExtendingRendererBase(this.isExtendingRendererBase); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy