/* * RHQ Management Platform * Copyright (C) 2005-2009 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.helpers.bundleGen; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.Writer; import java.text.MessageFormat;import java.util.HashMap; import java.util.Map; import java.util.ResourceBundle; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import freemarker.cache.ClassTemplateLoader; import freemarker.cache.MultiTemplateLoader; import freemarker.cache.TemplateLoader; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.util.file.FileUtil; import org.rhq.core.util.stream.StreamUtil; /** * Main class of a (simple) bundle creator * @author Heiko W. Rupp */ public class BundleGen { private final Log log = LogFactory.getLog(BundleGen.class); public static void main(String[] args) throws Exception { BundleGen bg = new BundleGen(); bg.run(); } private void run() { ResourceBundle resourceBundle = ResourceBundle.getBundle("bundleGen"); Props props = new Props(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // Ask the user XmlQuestionsReader xqr = new XmlQuestionsReader("bundleQuestions"); try { xqr.readQuestions(br,props); } catch (Exception e) { log.error(e.getMessage()); return; } String bundleTargetDirectory = "/tmp"; // TODO ask user? File tmpDir = null; try { String tmpDirPath = System.getProperty("java.io.tmpdir"); tmpDir = FileUtil.createTempDirectory("bundle", null, new File(tmpDirPath)); tmpDir.setReadable(true); tmpDir.setWritable(true); tmpDir.setExecutable(true); tmpDir.deleteOnExit(); } catch (IOException e) { log.error(resourceBundle.getString("no.tmp.dir")); System.exit(1); } String genPath = tmpDir.getAbsolutePath(); createFile(props,"deployMain","deploy.xml", genPath); try { File outFile = new File(genPath,"generatedBundle.zip"); ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(outFile)); try { copyToOutputStream(zos,genPath,"deploy.xml"); copyToOutputStream(zos,props.getContentDir(),props.getBundleFile()); } finally { // by definition this automatically flushes! zos.close(); } File targetFile = new File(bundleTargetDirectory + "/" + "generatedBundle.zip"); boolean success = outFile.renameTo(targetFile); if (success) { targetFile.setReadable(true); log.info(MessageFormat.format(resourceBundle.getString("bundle.ready"), targetFile.getAbsolutePath())); } else { log.debug("Could not rename file to [" + targetFile.getAbsolutePath() + "]"); log.info(MessageFormat.format(resourceBundle.getString("bundle.ready"), outFile.getAbsolutePath())); } } catch (IOException e) { e.printStackTrace(); // TODO: Customise this generated block } } /** * Copy a file to the passed Zip Output Stream * @param zos OutputStream for a new Zip file * @param filedir directory of the file to copy * @param fileName name of the file to copy * @throws IOException If anything here goes wrong. */ private void copyToOutputStream(ZipOutputStream zos,String filedir, String fileName) throws IOException { ZipEntry entry = new ZipEntry(fileName); zos.putNextEntry(entry); FileInputStream fis = new FileInputStream(new File(filedir , fileName)); try { StreamUtil.copy(fis,zos,false); zos.flush(); log.debug("Added ["+ fileName + "]"); } finally { fis.close(); } } /** * Apply a freemarker template to generate a file * @param props The properties used to create the respective file * @param template The name of the template without .ftl suffix * @param fileName The name of the file to create * @param directory The name of the directory to create in */ public void createFile(Props props, String template, String fileName, String directory) { try { log.info("Trying to generate " + directory + "/" + fileName); Configuration config = new Configuration(); ClassTemplateLoader ctl = new ClassTemplateLoader(getClass(), "/"); TemplateLoader[] loaders = new TemplateLoader[] { ctl }; MultiTemplateLoader mtl = new MultiTemplateLoader(loaders); config.setTemplateLoader(mtl); Template templ = config.getTemplate(template + ".ftl"); Writer out = new BufferedWriter(new FileWriter(new File(directory, fileName))); try { Map<String, Props> root = new HashMap<String, Props>(); root.put("props", props); templ.process(root, out); } finally { out.close(); } } catch (IOException ioe) { ioe.printStackTrace(); } catch (TemplateException te) { te.printStackTrace(); } } }