Package cn.org.rapid_framework.generator.ext.ant

Source Code of cn.org.rapid_framework.generator.ext.ant.BaseGeneratorTask

package cn.org.rapid_framework.generator.ext.ant;

import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.tools.ant.AntClassLoader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;

import cn.org.rapid_framework.generator.GeneratorFacade;
import cn.org.rapid_framework.generator.GeneratorProperties;
import cn.org.rapid_framework.generator.ext.tableconfig.builder.TableConfigXmlBuilder;
import cn.org.rapid_framework.generator.ext.tableconfig.model.TableConfigSet;
import cn.org.rapid_framework.generator.util.SystemHelper;

public abstract class BaseGeneratorTask extends Task{
    protected Path classpath;
   
    protected String shareInput; //共享模板目录,可以使用classpath:前缀
    protected String input; //模板输入目录,可以使用classpath:前缀
    protected String output; //模板输出目录,可以使用classpath:前缀
   
    private boolean openOutputDir = false;
    private String _package;
   
    public static Properties toProperties(Hashtable properties) {
        Properties props = new Properties();
        props.putAll(properties);
        return props;
    }
   
    private void error(Exception e) {
        StringWriter out = new StringWriter();
        e.printStackTrace(new PrintWriter(out));
        log(out.toString(),Project.MSG_ERR);
    }
   
    protected GeneratorFacade createGeneratorFacade(String input,String output) {
        if(input == null) throw new IllegalArgumentException("input must be not null");
        if(output == null) throw new IllegalArgumentException("output must be not null");
       
        GeneratorProperties.setProperties(new Properties());
        Properties properties = toProperties(getProject().getProperties());
        properties.setProperty("basedir", getProject().getBaseDir().getAbsolutePath());
        GeneratorProperties.setProperties(properties);
       
        GeneratorFacade gf = new GeneratorFacade();
        gf.getGenerator().addTemplateRootDir(input);
        if(shareInput != null) {
            gf.getGenerator().addTemplateRootDir(shareInput);
        }
        gf.getGenerator().setOutRootDir(output);
        return gf;
    }
   
    public String getShareInput() {
        return shareInput;
    }

    public void setShareInput(String shareInput) {
        this.shareInput = shareInput;
    }

    public void setInput(String input) {
        this.input = input;
    }

    public void setOutput(String output) {
        this.output = output;
    }
   
    public void setOpenOutputDir(boolean openOutputDir) {
        this.openOutputDir = openOutputDir;
    }

    public String getPackage() {
        return _package;
    }

    public void setPackage(String _package) {
        this._package = _package;
    }
   
    public void setClasspathRef(Reference r){
        this.classpath = new Path(getProject());
        this.classpath.setRefid(r);
    }

    @Override
    final public void execute() throws BuildException {
        super.execute();
        setContextClassLoader();
        try {
          executeInternal();
        }catch(Exception e) {
            error(e);
            throw new BuildException(e);
        }
    }

    protected void executeInternal() throws Exception {
        freemarker.log.Logger.selectLoggerLibrary(freemarker.log.Logger.LIBRARY_NONE);
       
        executeBefore();
       
        GeneratorFacade facade = createGeneratorFacade(input,output);
       
        List<Map> maps = getGeneratorContexts();
        if(maps == null) return;
        for(Map map : maps) {
            facade.generateByMap(map);
        }
       
        if(openOutputDir && SystemHelper.isWindowsOS) {
            Runtime.getRuntime().exec("cmd.exe /c start "+output);
        }
    }

  private void setContextClassLoader() {
        if(classpath == null) {
            String cp = ((AntClassLoader) getClass().getClassLoader()).getClasspath();
            classpath = new Path(getProject(),cp);
        }
        AntClassLoader classloader = new AntClassLoader(getProject(),classpath,true);
        Thread.currentThread().setContextClassLoader(classloader);
    }

    protected void executeBefore() throws Exception {
  }
   
    protected abstract List<Map> getGeneratorContexts() throws Exception;
   
}
TOP

Related Classes of cn.org.rapid_framework.generator.ext.ant.BaseGeneratorTask

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.