blob: a2bde9ec7b6fba6a74fce92bfdf8b1074d86a57d [file] [log] [blame]
/*******************************************************************************
* 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);
}
}