/******************************************************************************* * Copyright (c) 2012, 2013 Pivotal Software, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Pivotal Software, Inc. - initial API and implementation *******************************************************************************/ package org.springsource.ide.eclipse.commons.core.templates; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.springsource.ide.eclipse.commons.core.FileUtil; /** * @author Terry Denney * @author Leo Dos Santos * @author Christian Dupuis * @author Kaitlin Duck Sherwood * @author Kris De Volder (Add recursion over directories). */ public class TemplateProcessor { private static Logger logger = Logger.getLogger(TemplateProcessor.class); protected Map<String, String> replacementContext = new HashMap<String, String>(); // protected SpringVersionProcessor springProcessor; public TemplateProcessor(Map<String, String> replacementContext) { this.replacementContext = replacementContext; } // public TemplateProcessor(Map<String, String> replacementContext, SpringVersion springVersion) { // this.replacementContext = replacementContext; // // if (springVersion != null && !springVersion.equals(SpringVersion.DEFAULT)) { // this.springProcessor = new SpringVersionProcessor(springVersion.getVersion()); // } // } public void process(File source, File target) throws IOException { if (FileUtil.isBinaryFile(source)) { logger.debug("Copying binary file " + source); FileUtil.copy(source, target); } else if (source.isDirectory()) { try { FileUtil.copyDirectory(source, target, new NullProgressMonitor()); } catch (CoreException e) { logger.error("Problem while attempting to copy template directory", e); } String[] names = source.list(); if (names!=null) { for (String childName : names) { File childSource = new File(source, childName); File childTarget = new File(target, childName); process(childSource, childTarget); } } } else { logger.debug("Template processing text file " + source); process(new FileReader(source), new FileWriter(target)); } } public void process(Reader reader, Writer writer) throws IOException { BufferedReader bufferedReader = new BufferedReader(reader); BufferedWriter bufferedWriter = new BufferedWriter(writer); while (true) { String line = bufferedReader.readLine(); if (line == null) { break; } line = replaceTokens(line); bufferedWriter.write(line); bufferedWriter.write('\n'); } bufferedWriter.flush(); } public String replaceTokens(String input) { String topLevelPackageStr = replacementContext.get("||top-level-package||"); if (topLevelPackageStr != null) { if (topLevelPackageStr.startsWith("&&")) { topLevelPackageStr = topLevelPackageStr.substring(2); } topLevelPackageStr = topLevelPackageStr.replaceAll("&&", "."); String userTopLevelPackageStr = replacementContext.get("||user-top-level-package||"); if (userTopLevelPackageStr.startsWith("&&")) { userTopLevelPackageStr = userTopLevelPackageStr.substring(2); } if (input.contains(topLevelPackageStr) && userTopLevelPackageStr != null) { int index = input.indexOf(topLevelPackageStr); String newInput = input.substring(0, index) + userTopLevelPackageStr.replaceAll("&&", "."); if (index + topLevelPackageStr.length() < input.length()) { newInput += input.substring(index + topLevelPackageStr.length()); } input = newInput; } } for (String token : replacementContext.keySet()) { String replacement = replacementContext.get(token); input = input.replace(token, replacement); } if (input.indexOf("my") >= 0) { logger.warn("May have failed to replace token " + input); } return input; } public String replacePathForDirectory(String path, char separator) { String originalTopLevelPackageStr = replacementContext.get("||top-level-package||"); if (originalTopLevelPackageStr != null) { originalTopLevelPackageStr = originalTopLevelPackageStr.replaceAll("&&", "\\" + separator); String userTopLevelPackageStr = replacementContext.get("||user-top-level-package||"); if (path.contains(originalTopLevelPackageStr) && userTopLevelPackageStr != null) { int index = path.indexOf(originalTopLevelPackageStr); String replacementString = userTopLevelPackageStr.replaceAll("&&", "\\" + separator); String newPath = path.substring(0, index) + replacementString; if (index + 1 + originalTopLevelPackageStr.length() < path.length()) { newPath += path.substring(index + originalTopLevelPackageStr.length()); } return newPath; } } return null; } }