/******************************************************************************* * Copyright (c) 2007, 2014 Symbian Software Limited and others. * 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: * Bala Torati (Symbian) - Initial API and implementation * Mark Espiritu (VastSystems) - bug 215283 * Raphael Zulliger (Indel AG) - [367482] fixed resource leak * Doug Schaefer (QNX) - added different start and end patterns for macros *******************************************************************************/ package org.eclipse.cdt.core.templateengine.process; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.net.URL; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import com.ibm.icu.text.MessageFormat; /** * Acts as helper class for process the processes i.e., copy, replace and append files. */ public class ProcessHelper { public static final String CONDITION = "condition"; //$NON-NLS-1$ public static final String START_PATTERN = "$("; //$NON-NLS-1$ public static final String END_PATTERN = ")"; //$NON-NLS-1$ public static final String EQUALS = "=="; //$NON-NLS-1$ public static final String NOT_EQUALS = "!="; //$NON-NLS-1$ /** * This method is to append the given contents into a file. * * @param fileContents contents which are appended to the file. * @param toFile a file to append contents. * @throws IOException exception while writing contents into a file * @since 4.0 */ public static void appendFile(String fileContents, File toFile) throws IOException { RandomAccessFile raf = null; if (!toFile.exists()) { throw new FileNotFoundException(MessageFormat.format( Messages.getString("ProcessHelper.fileNotFound"), //$NON-NLS-1$ toFile.getPath())); } else { try { raf = new RandomAccessFile(toFile, "rw"); //$NON-NLS-1$ raf.skipBytes((int) raf.length()); raf.writeBytes(fileContents); } finally { if(raf != null) { raf.close(); } } } } /** * This method returns a vector of all replace marker strings. (e.g., * $(item), vector contains 'item' as one item) is the end pattern. * * @param str A given string possibly containing markers. * @return the set of names occurring within markers * @since 4.0 */ public static Set<String> getReplaceKeys(String str) { return getReplaceKeys(str, START_PATTERN, END_PATTERN); } /** * This method returns a vector of all replace marker strings. (e.g., * $(item), vector contains 'item' as one item) is the end pattern. * * @param str A given string possibly containing markers. * @param startPattern token to start macro replacement * @param endPattern token to end macro replacement * @return the set of names occurring within markers * @since 5.5 */ public static Set<String> getReplaceKeys(String str, String startPattern, String endPattern) { Set<String> replaceStrings = new HashSet<String>(); int start= 0; int end= 0; while ((start = str.indexOf(startPattern, start)) >= 0) { end = str.indexOf(endPattern, start); if (end != -1) { replaceStrings.add(str.substring(start + startPattern.length(), end)); start = end + endPattern.length(); } else { start++; } } return replaceStrings; } /** * This method takes a URL as parameter to read the contents, and to add * into a string buffer. * * @param source URL to read the contents. * @return string contents of a file specified in the URL source path. * @since 4.0 */ public static String readFromFile(URL source) throws IOException { char[] chars = new char[4092]; InputStreamReader contentsReader = null; StringBuilder buffer = new StringBuilder(); if (!new java.io.File(source.getFile()).exists()) { throw new FileNotFoundException(MessageFormat.format( Messages.getString("ProcessHelper.fileNotFound"), //$NON-NLS-1$ source.getFile())); } else { contentsReader = new InputStreamReader(source.openStream()); int c; do { c = contentsReader.read(chars); if (c == -1) break; buffer.append(chars, 0, c); } while (c != -1); contentsReader.close(); } return buffer.toString(); } /** * This method reads contents from source, and writes the contents into * destination file. * * @param source URL to read the contents. * @param dest destination file to write the contents. * @since 4.0 */ public static void copyBinaryFile(URL source, File dest) throws IOException { byte[] bytes = new byte[4092]; if (source != null && dest != null) { File file = new File(source.getFile()); if (file.isFile()) { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream(file); out = new FileOutputStream(dest); int len; while ((len = in.read(bytes)) != -1) { out.write(bytes, 0, len); } } finally { try { if (in != null) in.close(); } finally { if (out != null) out.close(); } } } } } /** * This method creates the directories in the parent folder. * @param projectHandle * @param parentFolder * @throws CoreException * * @since 4.0 */ public static void mkdirs(IProject projectHandle, IFolder parentFolder) throws CoreException { if (parentFolder.getProjectRelativePath().equals(projectHandle.getProjectRelativePath())) { return; } if (!parentFolder.getParent().exists()) { mkdirs(projectHandle, projectHandle.getFolder(parentFolder.getParent().getProjectRelativePath())); } parentFolder.create(true, true, null); } /** * @param string * @param macros * @param valueStore * @return the macro value after expanding the macros. * * @since 4.0 */ public static String getValueAfterExpandingMacros(String string, Set<String> macros, Map<String, String> valueStore) { return getValueAfterExpandingMacros(string, macros, valueStore, START_PATTERN, END_PATTERN); } /** * @param string * @param macros * @param valueStore * @return the macro value after expanding the macros. * * @since 5.5 */ public static String getValueAfterExpandingMacros(String string, Set<String> macros, Map<String, String> valueStore, String startPattern, String endPattern) { for (String key : macros) { String value = valueStore.get(key); if (value != null) { string = string.replace(startPattern + key + endPattern, value); } } return string; } /** * @param macro * @return the replacement marker string * * @since 4.0 */ public static String getReplaceMarker(String macro) { return START_PATTERN + macro + END_PATTERN; } }