Package org.ajax4jsf.builder.generator

Source Code of org.ajax4jsf.builder.generator.RendererGenerator

/**
* 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.generator;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.Writer;
import java.util.Iterator;

import org.ajax4jsf.builder.config.BuilderConfig;
import org.ajax4jsf.builder.config.ComponentBaseBean;
import org.ajax4jsf.builder.config.ComponentBean;
import org.ajax4jsf.builder.config.RendererBean;
import org.ajax4jsf.templatecompiler.builder.CompilationContext;
import org.ajax4jsf.templatecompiler.builder.CompilationException;
import org.ajax4jsf.templatecompiler.builder.TemplateCompiler;

/**
* Class implement functionality for generate base renderers java files, for
* manual extention. If renderer property override in config file set to true,
* override existing renderers files. inner element of
* {@link org.ajax4jsf.builder.ant.JSFGeneratorTask} use in ant build.xml :
* <jsfgenerator ... > .... <renderers ... /> ....
* </jsfgenerator> attributes: package - optional Java package name for
* override from configuration, used for create set of differern render-kits in
* one task {@see com.exadel.vcp.builder.ant.InnerGenerator}
*
* @author asmirnov@exadel.com (latest modification by $Author: alexsmirnov $)
* @version $Revision: 1.1.2.10 $ $Date: 2007/02/26 20:48:40 $
*
*/
public class RendererGenerator extends InnerGenerator {

  private static final String RENDERER_TEMPLATE_NAME = "renderer.vm";

  private File _srcDir = null;

  /**
   * Optional package name for override from config.
   */
  private String _package = null;

  /**
   * @return Returns the package.
   */
  public String getPackage() {
    return _package;
  }

  /**
   * @param package1
   *            The package to set.
   */
  public void setPackage(String package1) {
    _package = package1;
  }

  /**
   * @return the srcDir
   */
  public File getSrcDir() {
    return this._srcDir;
  }

  /**
   * @param srcDir
   *            the srcDir to set
   */
  public void setSrcDir(File srcDir) {
    this._srcDir = srcDir;
  }

  /**
   * @param task
   */
  public RendererGenerator(JSFGeneratorConfiguration task, Logger log) {
    super(task, log);

  }

  /*
   * (non-Javadoc)
   *
   * @see com.exadel.vcp.builder.ant.InnerGenerator#createFiles(com.exadel.vcp.builder.config.BuilderConfig)
   */
  public void createFiles(BuilderConfig config) throws GeneratorException {
    // Put common properties
    for (Iterator iter = config.getComponents().iterator(); iter.hasNext();) {
      ComponentBean component = (ComponentBean) iter.next();
      RendererBean renderer = component.getRenderer();
      createRenderer(renderer, component);
    }
    for (Iterator iter = config.getRenderers().iterator(); iter.hasNext();) {
      RendererBean renderer = (RendererBean) iter.next();
      createRenderer(renderer, null);
    }
  }

  public void createRenderer(RendererBean renderer, ComponentBaseBean component)
      throws GeneratorException {
    if (null != renderer && renderer.isGenerate()
        && null != renderer.getTemplate()) {
      try {
        File template;
        if (null != getSrcDir()) {
          template = new File(getSrcDir(), renderer.getTemplate());
        } else {
          template = new File(renderer.getTemplate());
        }
        ClassLoader classLoader = getClassLoader();
        CompilationContext rendererBean = new RendererCompilationContext(
            getLog(), classLoader,getConfig());
        if (null != renderer.getClassname()) {
          rendererBean.setBaseclass(renderer.getClassname());

        }
        if (null != renderer.getClassname()) {
          rendererBean.setFullClassName(renderer.getClassname());
        }
        if (null != component) {
          try {
            rendererBean
                .setComponentClass(component.getClassname());
          } catch (CompilationException e) {
            if (null != component.getSuperclass()) {
              rendererBean.setComponentClass(component
                  .getSuperclass());
            }
          }

        }

// unfinished check of non-static fields in renderer classes       
//       
//        String baseclassName = rendererBean.getFullClassName();
//        try {
//            classLoader.loadClass(baseclassName);
//        } catch (ClassNotFoundException e) {
//            getLog().debug("Class not found: " + e.getLocalizedMessage());
//
//            baseclassName = rendererBean.getFullBaseclass();
//            classLoader.loadClass(baseclassName);
//        }
//       
//        if (baseclassName != null) {
//            Class<?> baseclass = classLoader.loadClass(baseclassName);
//            Class<? extends Annotation> annotationClass = (Class<? extends Annotation>) classLoader.loadClass("org.richfaces.AllowedRendererField");
//
//            do {
//          Field[] fields = baseclass.getDeclaredFields();
//          for (Field field : fields) {
//              if ((field.getModifiers() & Modifier.STATIC) == 0 && field.getAnnotation(annotationClass) == null) {
//            throw new RuntimeException("Non-static field: " + field + " in renderer class. ");
//              }
//          }
//         
//          baseclass = baseclass.getSuperclass();
//            } while (baseclass != null);
//        }
       
        TemplateCompiler templateCompiler = new TemplateCompiler();
        InputStream templateStream = new FileInputStream(template);
        templateCompiler.processing(templateStream, rendererBean);
        renderer.setClassname(rendererBean.getFullClassName());
        String resultPath = rendererBean.getComponentFileName();
        if (null == getPackage()) {
          resultPath = resultPath.replace('.', '/');
        } else {
          resultPath = getPackage().replace('.', '/') + "/"
              + resultPath;
        }

        File javaFile = new File(getDestDir(), resultPath + ".java");
        File javaDir = javaFile.getParentFile();
        if (!javaDir.exists()) {
          javaDir.mkdirs();
        }
        if (javaFile.exists()) {
          if (renderer.isOverride()) {
            javaFile.delete();
          } else {
            return;
          }
        }
        Writer out = new BufferedWriter(new FileWriter(javaFile));
        templateCompiler.generateCode(rendererBean, out);
        out.flush();
        out.close();
      } catch (Exception e) {
        throw new GeneratorException(
            "Error create Renderer Java file ", e);
      }
    }

  }

  /*
   * (non-Javadoc)
   *
   * @see com.exadel.vcp.builder.ant.InnerGenerator#getDefaultTemplateName()
   */
  protected String getDefaultTemplateName() {
    // TODO Auto-generated method stub
    return RENDERER_TEMPLATE_NAME;
  }

}
TOP

Related Classes of org.ajax4jsf.builder.generator.RendererGenerator

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.