Package org.ajax4jsf.builder.component

Source Code of org.ajax4jsf.builder.component.ComponentModelBuilder

/**
* 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.ajax4jsf.builder.component;

import static org.ajax4jsf.builder.model.Argument.arg;

import java.util.Collection;

import javax.faces.component.UIComponentBase;
import javax.faces.context.FacesContext;

import org.ajax4jsf.builder.component.state.ComponentStateManager;
import org.ajax4jsf.builder.config.ComponentBean;
import org.ajax4jsf.builder.config.PropertyBean;
import org.ajax4jsf.builder.config.RendererBean;
import org.ajax4jsf.builder.generator.GeneratorException;
import org.ajax4jsf.builder.generator.JSFGeneratorConfiguration;
import org.ajax4jsf.builder.model.JavaClass;
import org.ajax4jsf.builder.model.JavaConstructor;
import org.ajax4jsf.builder.model.JavaField;
import org.ajax4jsf.builder.model.JavaMethod;
import org.ajax4jsf.builder.model.JavaModifier;
import org.ajax4jsf.builder.model.JavaPackage;
import org.ajax4jsf.builder.model.MethodBody;

/**
* Build component class model from configs
* @author Maksim Kaszynski
*
*/
public class ComponentModelBuilder {
 
  private PropertyProcessor[] propertyProcessors = {
      new ActionSource2PropertyProcessor(),
      new ExpressionPropertyProcessor(),
      new PrimitivePropertyProcessor(),
      new ELPropertyProcessor(),
      new ComponentPropertyProcessor()};
 
  public JavaClass build(ComponentBean componentBean, JSFGeneratorConfiguration configuration) {
   
    String superclassname =
      componentBean.getSuperclass();
   
    JavaClass javaClass =
      new JavaClass(componentBean.getSimpleClassName(),
          new JavaPackage(componentBean.getPackageName()));
   
    try {
      Class<?> superClass =
        Class.forName(superclassname, false, configuration.getClassLoader());
     
      javaClass.setSuperClass(superClass);
     
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      javaClass.setSuperClass(UIComponentBase.class);
    }
   
    javaClass.addModifier(JavaModifier.PUBLIC);
   
    javaClass.addField(getComponentFamily(componentBean));
    javaClass.addField(getComponentType(componentBean));
   
    javaClass.addMethod(getConstructor(componentBean, javaClass));
   
    Collection<PropertyBean> properties = componentBean.getProperties();
   
    for (PropertyBean propertyBean : properties) {
      PropertyProcessor proc = null;
     
      for (int i = 0; i < propertyProcessors.length && proc == null; i++) {
       
        PropertyProcessor processor =
          propertyProcessors[i];
       
        if (processor.accept(propertyBean, javaClass, configuration)) {
          proc = processor;
        }
      }
     
      if (proc != null) {
        proc.process(propertyBean, javaClass, configuration);
      }
    }

    javaClass.addMethod(getComponentFamilyMethod(componentBean));
   
    ComponentStateManager stateManager = new ComponentStateManager(javaClass);
   
    JavaMethod saveState = getSaveStateTemplate();
    try {
      saveState.setMethodBody(stateManager.getSaveStateMethodBody(configuration));
    } catch (GeneratorException e) {
      e.printStackTrace();
    }
    javaClass.addMethod(saveState);
   
    JavaMethod restoreState = getRestoreStateTemplate();
    try {
      restoreState.setMethodBody(stateManager.getRestoreStateMethodBody(configuration));
    } catch (GeneratorException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    javaClass.addMethod(restoreState);
   
   
   
    return javaClass;
   
  }
 
  private JavaMethod getComponentFamilyMethod(ComponentBean componentBean) {
    JavaMethod javaMethod = new JavaMethod("getFamily", String.class);
    javaMethod.addModifier(JavaModifier.PUBLIC);
    javaMethod.setMethodBody(new MethodBody() {
      @Override
      public String toCode() {
        return "return COMPONENT_FAMILY;";
      }
    });
    return javaMethod;
  }
 
  private JavaMethod getRestoreStateTemplate() {
    JavaMethod method =
      new JavaMethod("restoreState",
          Void.TYPE,
          arg("context", FacesContext.class),
          arg("state", Object.class));
    method.addModifier(JavaModifier.PUBLIC);
    method.addAnnotation(Override.class);
   
    return method;
  }
 
  private JavaMethod getSaveStateTemplate() {
    JavaMethod method =
      new JavaMethod("saveState",
          Object.class,
          arg("context", FacesContext.class));
    method.addModifier(JavaModifier.PUBLIC);
    method.addAnnotation(Override.class);
    method.setMethodBody(new MethodBody() {
      @Override
      public String toCode() {
        return "return super.saveState(context);";
      }
    });
    return method;
  }
 
  private JavaField getComponentType(ComponentBean componentBean) {
    JavaField field = new JavaField(String.class, "COMPONENT_TYPE");
    field.addModifier(JavaModifier.PUBLIC);
    field.addModifier(JavaModifier.STATIC);
    field.addModifier(JavaModifier.FINAL);
    field.setValue("\"" + componentBean.getName() + "\"");
    return field;
  }
  private JavaField getComponentFamily(ComponentBean componentBean) {
    JavaField field = new JavaField(String.class, "COMPONENT_FAMILY");
    field.addModifier(JavaModifier.PUBLIC);
    field.addModifier(JavaModifier.STATIC);
    field.addModifier(JavaModifier.FINAL);
    field.setValue("\"" + componentBean.getFamily() + "\"");
    return field;
  }
 
  private JavaMethod getConstructor(ComponentBean componentBean, JavaClass javaClass) {
    final RendererBean renderer = componentBean.getRenderer();
    JavaMethod method = new JavaConstructor(javaClass);
    method.addModifier(JavaModifier.PUBLIC);
    method.setMethodBody(new MethodBody(method) {
      @Override
      public String toCode() {
        if (renderer != null) {
          return "setRendererType(\"" + renderer.getName() + "\");";
        }
        return super.toCode();
      }
    });
   
    return method;
  }
TOP

Related Classes of org.ajax4jsf.builder.component.ComponentModelBuilder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.