/******************************************************************************* * Copyright (c) 2007, 2008 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 * IBM Corporation *******************************************************************************/ package org.eclipse.cdt.core.templateengine; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Properties; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Plugin; import org.osgi.framework.Bundle; /** * Acts as an Helper class for Template Engine * * @since 4.0 */ public class TemplateEngineHelper { public static final String US = "_"; //$NON-NLS-1$ public static final String OPEN_MARKER = "$("; //$NON-NLS-1$ public static final String CLOSE_MARKER = ")"; //$NON-NLS-1$ public static final String STRING_EXTERNALIZATION_MARKER = "%"; //$NON-NLS-1$ public static final String LOGGER_FILE_NAME = "Process"; //$NON-NLS-1$ // This is used while getting the Plugin Path. public static final String PROJRESOURCE = "plugin.xml"; //$NON-NLS-1$ public static final String PLUGIN_ID = "pluginId"; //$NON-NLS-1$ public static final String PLUGIN_PROPERTIES = "plugin.properties"; //$NON-NLS-1$ public static final String TEMPLATE_PROPERTIES = "template.properties"; //$NON-NLS-1$ public static final String BOOLTRUE = "true"; //$NON-NLS-1$ public static final String ID = "id"; //$NON-NLS-1$ public static final String VALUE = "value"; //$NON-NLS-1$ public static final String SDLOG_FILE_NAME = "sharedDefaults"; //$NON-NLS-1$ public static final String LOCATION = "location"; //$NON-NLS-1$ public static final String WIZARD_ID = "wizardId"; //$NON-NLS-1$ public static final String FILTER_PATTERN = "filterPattern"; //$NON-NLS-1$ public static final String USAGE_DESCRIPTION = "usageDescription"; //$NON-NLS-1$ public static final String PROJECT_TYPE = "projectType"; //$NON-NLS-1$ public static final String TOOL_CHAIN = "toolChain"; //$NON-NLS-1$ public static final String EXTRA_PAGES_PROVIDER = "pagesAfterTemplateSelectionProvider"; //$NON-NLS-1$ public static final String IS_CATEGORY = "isCategory"; //$NON-NLS-1$ /** * Gets the backup shareddefaults XML file. Presence of the file indicates * that the template engine or the application underwent some crash or * destruction. * * @param sharedLocation * @return sharedXMLFile * * @since 4.0 */ public static File getSharedDefaultLocation(String sharedLocation) { File sharedXMLFile = findLocation(sharedLocation); return sharedXMLFile; } /** * Finds the location of the shareddefaults backup and original xml file. * * @param fileLocation * @return file * * @since 4.0 */ private static File findLocation(String fileLocation) { Plugin plugin = CCorePlugin.getDefault(); IPath stateLoc = plugin.getStateLocation(); fileLocation = stateLoc.toString() + File.separator + fileLocation; File file = new File(fileLocation); return file; } /** * Stores the shareddefaults xml file in * "${workspace}/.metadata/.plugins/${plugin.name}/shareddefaults.xml" path. * * @param sharedLocation the relative path within the plug-in * @return a File object corresponding to the location within the plug-in * * @since 4.0 */ public static File storeSharedDefaultLocation(String sharedLocation) { File sharedXMLFile = findLocation(sharedLocation); try { if(!sharedXMLFile.exists()) { sharedXMLFile.createNewFile(); } } catch (IOException e) { CCorePlugin.log(e); } return sharedXMLFile; } /** * This method returns the workspace path present in the workspace * * @return String Example : file:/C:/eclipse/workspace/ * * @since 4.0 */ public static IPath getWorkspacePath() { IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceRoot root = workspace.getRoot(); IPath workSpacePath = new Path(root.getLocation().toString() + File.separator); return workSpacePath; } /** * @param markerString * @return the first content of a region matching $(.*) e.g. given a String of the form "foo $(ID) bar", return ID. * * @since 4.0 */ public static String getFirstMarkerID(String markerString) { String key = null; if (markerString.indexOf(OPEN_MARKER) != -1) { key = markerString.substring(markerString.indexOf(OPEN_MARKER) + OPEN_MARKER.length(), markerString .indexOf(CLOSE_MARKER)); } return key; } /** * Check whether there is a directory existing in present workspace, with * the given name. * * @param directoryName * @return true, if directory exists. * * @since 4.0 */ public static boolean checkDirectoryInWorkspace(String directoryName) { boolean retVal = false; File file = null; try { file = new File(getWorkspacePath() + directoryName); } catch (Exception exp) { } if ((file != null) && (file.exists()) && (file.isDirectory())) { retVal = true; } return retVal; } /** * Return Template Source path as URL * @param pluginId * @param resourcePath * @return URL, of the Template Resource * @throws IOException * * @since 4.0 */ public static URL getTemplateResourceURL(String pluginId, String resourcePath) throws IOException { return FileLocator.find(Platform.getBundle(pluginId), new Path(resourcePath), null); } /** * * Returns the Template Resource Relative Path as URL * @param template * @param resourcePath * @return URL, of the Template Resource * @throws IOException * * @since 4.0 */ public static URL getTemplateResourceURLRelativeToTemplate(TemplateCore template, String resourcePath) throws IOException { TemplateInfo templateInfo = template.getTemplateInfo(); String path = templateInfo.getTemplatePath(); int slash = path.lastIndexOf("/"); //$NON-NLS-1$ if (slash == -1) { path = resourcePath; } else { path = path.substring(0, slash + 1) + resourcePath; } URL entry = FileLocator.find(Platform.getBundle(templateInfo.getPluginId()), new Path(path), null); if (entry == null) { return null; } return FileLocator.toFileURL(entry); } public static String externalizeTemplateString(TemplateInfo ti, String key) { if (key.startsWith(STRING_EXTERNALIZATION_MARKER)) { String pluginId = ti.getPluginId(); String path = ti.getTemplatePath(); IPath p = new Path(path); String propertiesPath = TEMPLATE_PROPERTIES; if(p.segmentCount() != 0){ p = p.removeLastSegments(1); propertiesPath = p.append(propertiesPath).toString(); } return externalizeTemplateString(pluginId, propertiesPath, key); } return key; } public static String externalizeTemplateString(String pluginId, String location, String key) { String value= null; if (key != null && key.startsWith(STRING_EXTERNALIZATION_MARKER)) { try { value = location != null ? getValueFromProperties(pluginId, location, key.substring(1)) : null; if (value == null) { value = getValueFromProperties(pluginId, PLUGIN_PROPERTIES, key.substring(1)); } } catch (IOException e) { value = key; e.printStackTrace(); } } return value == null ? key : value; } private static String getValueFromProperties(String pluginId, String propertiesFile, String key) throws IOException { String value = null; Bundle b = Platform.getBundle(pluginId); URL url= getResourceURL(b, propertiesFile); if (url != null) { InputStream in= url.openStream(); Properties p = new Properties(); p.load(in); value = (String) p.get(key); } return value; } private static URL getResourceURL(Bundle bundle, String propertiesFile) { return FileLocator.find(bundle, new Path(propertiesFile), null); } }