Package cn.org.rapid_framework.generator

Source Code of cn.org.rapid_framework.generator.GeneratorControl

package cn.org.rapid_framework.generator;

import static cn.org.rapid_framework.generator.GeneratorConstants.GG_IS_OVERRIDE;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.swing.JOptionPane;

import org.xml.sax.InputSource;

import cn.org.rapid_framework.generator.provider.db.DataSourceProvider;
import cn.org.rapid_framework.generator.util.DBHelper;
import cn.org.rapid_framework.generator.util.FileHelper;
import cn.org.rapid_framework.generator.util.GLogger;
import cn.org.rapid_framework.generator.util.IOHelper;
import cn.org.rapid_framework.generator.util.SqlExecutorHelper;
import cn.org.rapid_framework.generator.util.StringHelper;
import cn.org.rapid_framework.generator.util.SystemHelper;
import cn.org.rapid_framework.generator.util.XMLHelper;
import freemarker.ext.dom.NodeModel;
/**
* gg变量,生成器模板控制器,用于模板中可以控制生成器执行相关控制操作
* 如: 是否覆盖目标文件
*
* <pre>
* 使用方式:
* 可以在freemarker或是velocity中直接控制模板的生成
*
* ${gg.generateFile('d:/g_temp.log','info_from_generator')}
* ${gg.setIgnoreOutput(true)}
* </pre>
*
* ${gg.setIgnoreOutput(true)}将设置为true如果不生成
*
* @author badqiu
*
*/
public class GeneratorControl {
  private boolean isOverride = GeneratorProperties.getBoolean(GG_IS_OVERRIDE);
  private boolean isAppend = false; //no pass
  private boolean ignoreOutput = false;
  private boolean isMergeIfExists = true; //no pass
  private String mergeLocation;
  private String outRoot;
  private String outputEncoding;
  private String sourceFile;
  private String sourceDir;
  private String sourceFileName;
  private String sourceEncoding; //no pass //? 难道process两次确定sourceEncoding
  private String outputFile;
 
  /** load xml data */
  public NodeModel loadXml(String file) {
    return loadXml(file,true);
 
  /** load xml data */
  public NodeModel loadXml(String file,boolean removeXmlNamespace) {
    try {
      if(removeXmlNamespace) {
        InputStream forEncodingInput = FileHelper.getInputStream(file);
        String encoding = XMLHelper.getXMLEncoding(forEncodingInput);
        forEncodingInput.close();
       
        InputStream input = FileHelper.getInputStream(file);
        String xml = IOHelper.toString(encoding,input);
        xml = XMLHelper.removeXmlns(xml);
        input.close();
        return NodeModel.parse(new InputSource(new StringReader(xml.trim())));
      }else {
        return NodeModel.parse(new InputSource(FileHelper.getInputStream(file)));
      }
    } catch (Exception e) {
      throw new IllegalArgumentException("loadXml error,file:"+file,e);
    }
  }

  /** load Properties data */
  public Properties loadProperties(String file) {
    try {
      Properties p = new Properties();
      InputStream in = FileHelper.getInputStream(file);
      if(file.endsWith(".xml")) {
        p.loadFromXML(in);
      }else {
        p.load(in);
      }
      in.close();
      return p;
    } catch (Exception e) {
      throw new IllegalArgumentException("loadProperties error,file:"+file,e);
    }
  }

    public void generateFile(String outputFile,String content) {
       generateFile(outputFile,content,false);
    }
  /**
   * 生成文件  
   * @param outputFile
   * @param content
   * @param append
   */
  public void generateFile(String outputFile,String content,boolean append) {
    try {
      String realOutputFile = null;
      if(new File(outputFile).isAbsolute()) {
        realOutputFile = outputFile ;
      }else {
        realOutputFile = new File(getOutRoot(),outputFile).getAbsolutePath();
      }
     
      if(deleteGeneratedFile) {
        GLogger.println("[delete gg.generateFile()] file:"+realOutputFile+" by template:"+getSourceFile());
        new File(realOutputFile).delete();
      }else {
        File file = new File(realOutputFile);
        FileHelper.parentMkdir(file);
        GLogger.println("[gg.generateFile()] outputFile:"+realOutputFile+" append:"+append+" by template:"+getSourceFile());
        IOHelper.saveFile(file, content,getOutputEncoding(),append);
      }
    } catch (Exception e) {
      GLogger.warn("gg.generateFile() occer error,outputFile:"+outputFile+" caused by:"+e,e);
      throw new RuntimeException("gg.generateFile() occer error,outputFile:"+outputFile+" caused by:"+e,e);
    }
  }
 
  public boolean isOverride() {
    return isOverride;
  }
  /**如果目标文件存在,控制是否要覆盖文件 */
  public void setOverride(boolean isOverride) {
    this.isOverride = isOverride;
  }

  public boolean isIgnoreOutput() {
    return ignoreOutput;
  }
  /** 控制是否要生成文件  */
  public void setIgnoreOutput(boolean ignoreOutput) {
    this.ignoreOutput = ignoreOutput;
  }

  public boolean isMergeIfExists() {
    return isMergeIfExists;
  }

  public void setMergeIfExists(boolean isMergeIfExists) {
    this.isMergeIfExists = isMergeIfExists;
  }

  public String getMergeLocation() {
    return mergeLocation;
  }

  public void setMergeLocation(String mergeLocation) {
    this.mergeLocation = mergeLocation;
  }

  public String getOutRoot() {
    return outRoot;
  }
  /** 生成的输出根目录 */
  public void setOutRoot(String outRoot) {
    this.outRoot = outRoot;
  }

  public String getOutputEncoding() {
    return outputEncoding;
  }
  /** 设置输出encoding */
  public void setOutputEncoding(String outputEncoding) {
    this.outputEncoding = outputEncoding;
  }
  /** 得到源文件 */
  public String getSourceFile() {
    return sourceFile;
  }

  public void setSourceFile(String sourceFile) {
    this.sourceFile = sourceFile;
  }

  /** 得到源文件所在目录 */
  public String getSourceDir() {
    return sourceDir;
  }

  public void setSourceDir(String sourceDir) {
    this.sourceDir = sourceDir;
  }

  /** 得到源文件的文件名称 */
  public String getSourceFileName() {
    return sourceFileName;
  }

  public void setSourceFileName(String sourceFileName) {
    this.sourceFileName = sourceFileName;
  }

  /** 得到源文件的encoding */
  public String getSourceEncoding() {
    return sourceEncoding;
  }

  public void setSourceEncoding(String sourceEncoding) {
    this.sourceEncoding = sourceEncoding;
  }
 
  public String getOutputFile() {
    if(outputFile == null) return null;
   
      if(new File(outputFile).isAbsolute()) {
          return outputFile;
      }else {
          return new File(getOutRoot(),outputFile).getAbsolutePath();
      }
    }
 
    public void setOutputFile(String outputFile) {
        this.outputFile = outputFile;
    }
   
    public boolean isExistsOutputFile() {
        return new File(outRoot,outputFile).exists();
    }
   
    public boolean outputFileMatchs(String regex) throws IOException {
        if(isExistsOutputFile()) {
            String content = IOHelper.readFile(new File(outRoot,outputFile), sourceEncoding);
            if(StringHelper.indexOfByRegex(content, regex) >= 0) {
                return true;
            }
        }
        return false;
    }
   
    public boolean outputFileContains(String s) throws IOException {
        if(isExistsOutputFile()) {
            String content = IOHelper.readFile(new File(outRoot,outputFile), sourceEncoding);
            return content.contains(s);
        }
        return false;
    }
   
    /** 得到property,查到不到则使用defaultValue */
  public String getProperty(String key,String defaultValue){
    return GeneratorProperties.getProperty(key, defaultValue);
  }
 
  public String insertAfter(String compareToken,String str) throws IOException {
      String content = IOHelper.readFile(new File(outRoot,outputFile).getAbsoluteFile(), sourceEncoding);
      if(StringHelper.isBlank(content)) throw new IllegalArgumentException(new File(outRoot,outputFile).getAbsolutePath()+" is blank");
        return StringHelper.insertAfter(content, compareToken, str);
  }
 
  public String insertBefore(String compareToken,String str) throws IOException {
      String content = IOHelper.readFile(new File(outRoot,outputFile), sourceEncoding);
      if(StringHelper.isBlank(content)) throw new IllegalArgumentException(new File(outRoot,outputFile).getAbsolutePath()+" is blank");
        return StringHelper.insertBefore(content, compareToken, str);
  }
 
  public String append(String str) throws IOException {
      String content = IOHelper.readFile(new File(outRoot,outputFile), sourceEncoding);
      if(StringHelper.isBlank(content)) throw new IllegalArgumentException(new File(outRoot,outputFile).getAbsolutePath()+" is blank");
      return new StringBuffer(content).append(str).toString();
  }
 
  public String prepend(String str) throws IOException {
      String content = IOHelper.readFile(new File(outRoot,outputFile), sourceEncoding);
      if(StringHelper.isBlank(content)) throw new IllegalArgumentException(new File(outRoot,outputFile).getAbsolutePath()+" is blank");
      return new StringBuffer(content).insert(0,str).toString();
  }

//  public String getRequiredProperty(String key){
//    return GeneratorProperties.getRequiredProperty(key);
//  }

  /** 让用户输入property,windows则弹出输入框,linux则为命令行输入 */
  public String getInputProperty(String key) throws IOException {
    return getInputProperty(key, "Please input value for "+key+":");
  }
 
  public String getInputProperty(String key,String message) throws IOException {
    String v = GeneratorProperties.getProperty(key);
    if(v == null) {
      if(SystemHelper.isWindowsOS) {
        v = JOptionPane.showInputDialog(null,message,"template:"+getSourceFileName(),JOptionPane.OK_OPTION);
      }else {
        System.out.print("template:"+getSourceFileName()+","+message);
        v = new BufferedReader(new InputStreamReader(System.in)).readLine();
      }
      GeneratorProperties.setProperty(key, v);
    }
    return v;
  }
 
  public List<Map> queryForList(String sql,int limit) throws SQLException {
    Connection conn = DataSourceProvider.getConnection();
    try {
      List<Map> result =  SqlExecutorHelper.queryForList(conn, sql, limit);
      return result;
    }finally {
      DBHelper.close(conn);
    }
  }
 
  boolean deleteGeneratedFile = false;

   
   
   
}
TOP

Related Classes of cn.org.rapid_framework.generator.GeneratorControl

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.