package org.quickbundle.mda.mvm; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.sql.Timestamp; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.xml.transform.TransformerException; import org.quickbundle.mda.RmTransform; import org.quickbundle.tools.helper.io.RmFileHelper; import org.quickbundle.tools.helper.xml.RmXmlHelper; public class TemplateHelper { public static String getJavaFileDescComment(String outputFile) { StringBuilder result = new StringBuilder(); result.append("//代码生成时,文件路径: ") .append(RmXmlHelper.formatToUrlNoPrefix(outputFile)) .append("\n") .append("//代码生成时,系统时间:") .append(getSysDateTime()) .append(", 操作系统用户:") .append(System.getProperty("user.name")) .append("\n\n"); return result.toString(); } private static String getSysDateTime() { return new Timestamp(System.currentTimeMillis()).toString().substring(0,19); } /** * 功能:输出转化文件 * * @param xsltPath * @param myTableDoc * @param outputFile * @throws TransformerException */ public static void outPutFile(String xsltPath, String myTableXml, String outputFile) { outputFile = RmXmlHelper.formatToFile(outputFile); RmFileHelper.initParentDir(outputFile); //创建父目录 try { String context = RmTransform.getStringFromTransform(xsltPath, myTableXml); if (outputFile.endsWith(".java")) { context = getJavaFileDescComment(outputFile) + context; } RmFileHelper.saveFile(context, outputFile); } catch (Exception e) { EclipseLog.logError("xslt=" + xsltPath + ", metaXml=" + myTableXml + "," + e.toString(), e); e.printStackTrace(); } } /** * 功能:转化文件,模板有初始化参数 * * @param xsltPath * @param myTableXml * @param outputFile * @param mAttribute */ public static void outPutFile4ResultDocument(String xsltPath, String myTableXml, String outputFolder) { outPutFile4ResultDocument(xsltPath, myTableXml, outputFolder, null); } /** * 功能:转化文件,模板有初始化参数 * * @param xsltPath * @param myTableXml * @param outputFile * @param mAttribute */ public static void outPutFile4ResultDocument(String xsltPath, String myTableXml, String outputFolder, String outputFile) { RmFileHelper.initSelfDir(RmXmlHelper.formatToFile(outputFolder)); if(outputFile != null && outputFile.length() > 0) { outputFile = RmXmlHelper.formatToFile(outputFile); RmFileHelper.initParentDir(outputFile); //创建目录 } Map<String, Object> mAttribute = new HashMap<String, Object>(); mAttribute.put("targetFullPath", RmXmlHelper.formatToUrl(outputFolder)); try { String context = RmTransform.getStringFromTransform(xsltPath, myTableXml, mAttribute); if(outputFile != null) { if (outputFile.endsWith(".java")) { context = getJavaFileDescComment(outputFile) + context; } RmFileHelper.saveFile(context, outputFile); } } catch (Exception e) { EclipseLog.logError("xslt=" + xsltPath + ", metaXml=" + myTableXml + "," + e.toString(), e); e.printStackTrace(); } {//如果目录为空则删除 removeFolderIfEmpty(outputFolder); if(outputFile != null && outputFile.length() > 0) { removeParentFolderIfEmpty(outputFile); } } } static void removeFolderIfEmpty(String folder) { File fTargetFolder = new File(RmXmlHelper.formatToFile(folder)); if(fTargetFolder.isDirectory() && fTargetFolder.list().length == 0) { fTargetFolder.delete(); } } static void removeParentFolderIfEmpty(String file) { File fTargetFolder = new File(RmXmlHelper.formatToFile(file)).getParentFile(); if(fTargetFolder.isDirectory() && fTargetFolder.list().length == 0) { fTargetFolder.delete(); } } /** * 功能:输出转化后的字符到指定文件 * * @param xsltPath * @param myTableDoc * @param outputFile * @param afterKeyWord */ public static void outPutFile(String xsltPath, String myTableXml, String outputFile, String afterKeyWord, boolean rowIsUnique) { outputFile = RmXmlHelper.formatToUrl(outputFile); RmFileHelper.initParentDir(outputFile); //创建父目录 String context = ""; try { context = RmTransform.getStringFromTransform(xsltPath, myTableXml); } catch (Exception e) { EclipseLog.logError("xslt=" + xsltPath + ", metaXml=" + myTableXml + "," + e.toString(), e); e.printStackTrace(); } writeToRandomFile(outputFile, context, afterKeyWord, rowIsUnique); } /** * 功能: 随机访问文件tartetPath,把context插到afterKeyWord后边 * * @param outputFile * @param context * @param afterKeyWord */ public static void writeToRandomFile(String outputFile, String content, String afterKeyWord, boolean rowIsUnique) { BufferedReader in = null; RandomAccessFile rf = null; outputFile = RmXmlHelper.formatToFile(outputFile); StringBuffer outputFileStr = new StringBuffer(); try { if (new File(outputFile).exists()) { //检查是否已经存在相同代码 in = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile), "UTF-8")); String s1 = null; while ((s1 = in.readLine()) != null) { outputFileStr.append(s1 + "\n"); } if (outputFileStr.toString().indexOf(content.trim()) >= 0) { //已经存在 (截掉制表符,减少重复写入文件的可能) return; } } if(rowIsUnique) { //如果每一行数据不能重复 Set<String> sOutputFileRow = new HashSet<String>(); String[] aOutputFileRow = outputFileStr.toString().split("\n"); for (int i = 0; i < aOutputFileRow.length; i++) { if(aOutputFileRow[i].trim().length() > 0) { sOutputFileRow.add(aOutputFileRow[i].trim()); } } outputFileStr = null; //开始找位置 String line = null; long position = 0; rf = new RandomAccessFile(outputFile, "rw"); while (true) { line = rf.readLine(); if (line != null) { if (line.trim().equals(afterKeyWord)) { position = rf.getFilePointer(); break; } } else { position = rf.getFilePointer(); break; } } StringBuffer originRemain = new StringBuffer(); while ((line = rf.readLine()) != null) { originRemain.append(line + "\n"); } rf.seek(position); //开始写文件 String[] aContentRow = content.split("\n"); for (int i = 0; i < aContentRow.length; i++) { String tempContentRow = null; if(sOutputFileRow.contains(aContentRow[i].trim())) { //如果出现重复行 if(outputFile.endsWith("xml")) { tempContentRow = "<!--" + aContentRow[i] + "-->"; } else if(outputFile.endsWith("java")) { tempContentRow = "//" + aContentRow[i]; } else if(outputFile.endsWith("properties")) { tempContentRow = "#" + aContentRow[i]; } } else { tempContentRow = aContentRow[i]; } tempContentRow += "\n"; rf.write(tempContentRow.getBytes("UTF-8")); } rf.writeBytes(originRemain.toString()); } else { //每一行数据可以重复 //开始找位置 String line = null; long position = 0; rf = new RandomAccessFile(outputFile, "rw"); while (true) { line = rf.readLine(); if (line != null) { if (line.trim().equals(afterKeyWord)) { position = rf.getFilePointer(); break; } } else { position = rf.getFilePointer(); break; } } StringBuffer originRemain = new StringBuffer(); while ((line = rf.readLine()) != null) { originRemain.append(line + "\n"); } rf.seek(position); //开始写文件 rf.write(content.getBytes("UTF-8")); //rf.write(new String(originRemain.getBytes("iso8859-1"),"UTF-8").getBytes("UTF-8")); rf.writeBytes(originRemain.toString()); } } catch (Exception e) { e.printStackTrace(); } finally { try { if(in != null) { in.close(); } if (rf != null) { rf.close(); } } catch (IOException e2) { e2.printStackTrace(); } } } }