/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.motorola.studio.android.common.utilities; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Plugin; import org.eclipse.osgi.util.NLS; import org.osgi.framework.Bundle; import com.motorola.studio.android.common.exception.AndroidException; import com.motorola.studio.android.common.log.StudioLogger; import com.motorola.studio.android.common.utilities.i18n.UtilitiesNLS; /** * DESCRIPTION: This class serves as an utility class containing only static methods such as getters * for plugin attributes, plugin resources, installation path etc * * USAGE: Import this class then use the static methods. */ public class PluginUtils { public static final int OS_WINDOWS = 0; public static final int OS_LINUX = 1; /** * Returns a plugin attribute using the extension as parameter. * * @param fromExtension * the extension from which the attribute should be collected * @param element * the extension element * @param attribute * the extension attribute * * @return * the value of the extension attribute * * @throws MotodevExtensionException if the executable cannot be created for any reason */ public static Object getExecutable(String extensionId, String elementName, String executableName) throws Exception { Object executable = null; IExtension fromExtension = getExtension(extensionId); if ((fromExtension != null) && (elementName != null)) { IConfigurationElement[] elements = fromExtension.getConfigurationElements(); for (IConfigurationElement element : elements) { if (elementName.equals(element.getName())) { try { executable = element.createExecutableExtension(executableName); } catch (Exception e) { String errMsg = NLS.bind( UtilitiesNLS.EXC_PluginUtils_ErrorGettingTheExecutableFromExtensionPoint, new Object[] { executableName, elementName, extensionId }); StudioLogger.error(PluginUtils.class, errMsg, e); throw new Exception(errMsg, e); } } } } return executable; } /** * Returns a plugin attribute using the extension as parameter. * * @param fromExtension * the extension from which the attribute should be collected * @param element * the extension element * @param attribute * the extension attribute * * @return * the value of the extension attribute * * @throws MotodevExtensionException if the executable cannot be created for any reason */ public static Object getExecutable(String extensionId, String elementName) throws Exception { return getExecutable(extensionId, elementName, "class"); } /** * Returns the extension using as parameters the id of the extension * and the id of its extension point. * * @param extensionPointId * the id of the extension point * @param extensionId * the id of the extension * * @return * the extension */ public static IExtension getExtension(String extensionPointId, String extensionId) { IExtensionRegistry registry = Platform.getExtensionRegistry(); IExtension extension = registry.getExtension(extensionPointId, extensionId); return extension; } /** * Returns the extension using as parameter only the id of the extension. * * @param extensionId * the id of the extension * * @return * the extension */ public static IExtension getExtension(String extensionId) { IExtensionRegistry registry = Platform.getExtensionRegistry(); IExtension extension = registry.getExtension(extensionId); return extension; } /** * Returns the label for the extension (extension name) using as parameters * the id of the extension and the id of its extension point. * * @param extensionPointId * the id of the extension point * @param extensionId * the id of the extension * * @return * the extension label */ public static String getExtensionLabel(String extensionPointId, String extensionId) { IExtension extension = getExtension(extensionPointId, extensionId); String extensionLabel; if (extension != null) { extensionLabel = extension.getLabel(); } else { extensionLabel = extensionId; } return extensionLabel; } /** * Returns the label for the extension (extension name) using as parameter only * the id of the extension. * * @param extensionId * the id of the extension * * @return * the extension label */ public static String getExtensionLabel(String extensionId) { IExtension extension = getExtension(extensionId); String extensionLabel; if (extension != null) { extensionLabel = extension.getLabel(); } else { extensionLabel = extensionId; } return extensionLabel; } /** * Returns a collection of strings containing the ids of installed plugins. * * @param extensionPointId * the id of the extension point * * @return * a collection object containing the ids of the installed plugins */ public static Collection<String> getInstalledPlugins(String extensionPointId) { IExtensionRegistry registry = Platform.getExtensionRegistry(); IExtensionPoint extensionPoint = registry.getExtensionPoint(extensionPointId); Collection<String> pluginIds = new LinkedHashSet<String>(); if (extensionPoint != null) { for (IExtension extension : extensionPoint.getExtensions()) { pluginIds.add(extension.getUniqueIdentifier()); } } return pluginIds; } /** * Fills an array object with the ids contained in the collection object returned by * {@link #getInstalledPlugins(String)}. * * @param extensionPointId * the id of the extension point * * @return * an array object containing the ids of the installed plugins */ public static String[] getInstalledPluginsAsArray(String extensionPointId) { Collection<String> sampleAppPluginIds = getInstalledPlugins(extensionPointId); String[] sampleAppPluginIdsArray = new String[sampleAppPluginIds.size()]; return sampleAppPluginIds.toArray(sampleAppPluginIdsArray); } /** * Retrieves the namespaces used by the platform. * * * @return a collection with the namespaces used by the platform */ public static Collection<String> getPlatformNamespaces() { IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); String[] namespaces = extensionRegistry.getNamespaces(); return Arrays.asList(namespaces); } /** * Returns a plugin attribute using the extension id and the extension point id as parameters. * * @param extensionPointId * the id of the extension point of the exten sion * @param extensionId * the id of the extension * @param element * the extension element * @param attribute * the extension attribute * * @return * the value of the extension attribute */ public static String getPluginAttribute(String extensionPointId, String extensionId, String element, String attribute) { IExtension fromPlugin = getExtension(extensionPointId, extensionId); return getPluginAttribute(fromPlugin, element, attribute); } /** * Returns a plugin attribute using the extension id and the extension point id as parameters. * * @param extensionId * the id of the extension * @param element * the extension element * @param attribute * the extension attribute * * @return * the value of the extension attribute */ public static String getPluginAttribute(String extensionId, String element, String attribute) { IExtension fromPlugin = getExtension(extensionId); return getPluginAttribute(fromPlugin, element, attribute); } /** * Returns a plugin attribute using the extension as parameter. * * @param fromExtension * the extension from which the attribute should be collected * @param element * the extension element * @param attribute * the extension attribute * * @return * the value of the extension attribute */ public static String getPluginAttribute(IExtension fromExtension, String element, String attribute) { String attributeValue = null; if (fromExtension != null) { IConfigurationElement[] ceArray = fromExtension.getConfigurationElements(); for (IConfigurationElement ce : ceArray) { if ((ce != null) && ce.getName().equals(element)) { attributeValue = ce.getAttribute(attribute); } } } return attributeValue; } /** * DOCUMENT ME * * @param extensionId DOCUMENT ME! * @param element DOCUMENT ME! * * @return DOCUMENT ME! */ public static Collection<Map<String, String>> getPluginAttributes(String extensionId, String element) { IExtension fromExtension = getExtension(extensionId); return getPluginAttributes(fromExtension, element); } /** * DOCUMENT ME * * @param fromExtension DOCUMENT ME! * @param element DOCUMENT ME! * * @return DOCUMENT ME! */ public static Collection<Map<String, String>> getPluginAttributes(IExtension fromExtension, String element) { Collection<Map<String, String>> elementValues = new LinkedHashSet<Map<String, String>>(); if (fromExtension != null) { IConfigurationElement[] ceArray = fromExtension.getConfigurationElements(); for (IConfigurationElement ce : ceArray) { if ((ce != null) && ce.getName().equals(element)) { String[] attributes = ce.getAttributeNames(); if ((attributes != null) && (attributes.length > 0)) { int attributesLenght = attributes.length; Map<String, String> attributesMap = new LinkedHashMap<String, String>(attributesLenght, attributesLenght); for (String attribute : attributes) { String attributeValue = ce.getAttribute(attribute); if ((attributeValue != null) && (!attributeValue.equals(""))) { attributesMap.put(attribute, attributeValue); } } // only add to elementValues if all values were read correctly if (attributesMap.size() == attributesLenght) { elementValues.add(attributesMap); } } } } } return elementValues; } /** * Returns the absolute path of installation as a file object using the plugin as parameter. * * @param plugin * the plugin installed * * @return * a file object pointing to the installation path of the plugin */ public static File getPluginInstallationPath(Plugin plugin) { Bundle pluginBundle = plugin.getBundle(); return getPluginInstallationPath(pluginBundle); } /** * Returns the absolute path of installation as a file object using the ids of the extension * and extension point as parameters. * * @param extensionPointId * the id of the extension point * @param extensionId * the id of the extension * * @return * a file object pointing to the installation path of the plugin */ public static File getPluginInstallationPath(String extensionPointId, String extensionId) { IExtension extension = getExtension(extensionPointId, extensionId); return getPluginInstallationPath(extension); } /** * Returns the absolute path of installation as a file object using the extension as parameter. * * @param extension * the extension object * * @return * a file object pointing to the installation path of the plugin */ public static File getPluginInstallationPath(IExtension extension) { String pluginId = extension.getNamespaceIdentifier(); Bundle pluginBundle = Platform.getBundle(pluginId); return getPluginInstallationPath(pluginBundle); } /** * Returns the absolute path of installation as a file object using the plugin bundle as parameter. * * @param pluginBundle * the plugin bundle * * @return * a file object pointing to the installation path of the plugin */ public static File getPluginInstallationPath(Bundle pluginBundle) { //get file using FileLocator File relativeInstalationPath = null; try { relativeInstalationPath = new File(FileLocator.toFileURL(pluginBundle.getEntry("")).getFile()); } catch (IOException e) { StudioLogger.warn("Illegal state while getting plugin installation path (" + e.getMessage() + ")."); } //if failed to get the file using FileLocator if (relativeInstalationPath == null) { String platformPath = Platform.getInstallLocation().getURL().getPath(); String pluginPath = pluginBundle.getLocation(); int removeIndex = pluginPath.indexOf("@"); pluginPath = pluginPath.substring(removeIndex + 1); relativeInstalationPath = new File(platformPath, pluginPath); } return FileUtil.getCanonicalFile(relativeInstalationPath); } /** * Returns a file object from the path: $installationPath\resource * * @param plugin * the plugin object * * @param resource * the plugin resource * * @return * a file object pointing to the path of the resource * * @throws MotodevResourceNotAvailable * throws an exception if it occurs an I/O exception with the path $installationPath\resource */ public static File getPluginResource(Plugin plugin, String resource) throws Exception { File pluginPath = getPluginInstallationPath(plugin); File resourceFile = new File(pluginPath, resource); File canonicalFile = null; canonicalFile = FileUtil.getCanonicalFile(resourceFile); return canonicalFile; } /** * Checks if an extension is installed using the extension point id and extension id as parameters. * * @param extensionPointId * the id of the extension point * @param extensionId * the id of the extension * * @return * true if the extension is installed or false otherwise */ public static boolean isInstalled(String extensionPointId, String extensionId) { return getExtension(extensionPointId, extensionId) != null; } /** * Checks if an extension is installed using the extension id as parameter. * * @param extensionId * the id of the extension * * @return * true if the extension is installed or false otherwise */ public static boolean isInstalled(String extensionId) { return getExtension(extensionId) != null; } /** * Returns which is the OS. * @return * a code corresponding to the proper OS */ public static int getOS() { int result = -1; String osName = System.getProperty("os.name").toLowerCase(); if (osName.indexOf("linux") > -1) { result = OS_LINUX; } else if (osName.indexOf("windows") > -1) { result = OS_WINDOWS; } return result; } /** * Retrieves the File object representing a file stored into the * preferences area of the given plugin * * @return the File inside the given plugin preferences area. * @throws MotodevException if it fails to determine the preferences directory of the given plugin */ public final static File getFileOnPreferenceDirectory(Plugin plugin, String filename) throws Exception { File targetXmlFile = null; try { IPath path = plugin.getStateLocation(); if (path != null) { path = path.append(filename); targetXmlFile = path.toFile().getAbsoluteFile(); } } catch (IllegalStateException e) { StudioLogger.warn("Illegal state while getting file on preferences directory (" + e.getMessage() + ")."); } if (targetXmlFile == null) { throw new AndroidException("Could use file " + filename + " on preferences plug-in " + plugin.getBundle().getBundleId()); } return targetXmlFile; } }