| /******************************************************************************* |
| * Copyright (c) 2000, 2013 IBM Corporation 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.ant.core; |
| |
| import java.net.URL; |
| import java.net.URLClassLoader; |
| import java.util.Arrays; |
| import java.util.List; |
| |
| import org.eclipse.ant.internal.core.AntClassLoader; |
| import org.eclipse.ant.internal.core.AntCoreUtil; |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IExtensionPoint; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.core.runtime.Plugin; |
| import org.eclipse.core.runtime.Status; |
| import org.osgi.framework.BundleContext; |
| |
| /** |
| * The plug-in runtime class for the Ant Core plug-in. Clients may not instantiate or subclass this class. |
| * |
| * @noinstantiate This class is not intended to be instantiated by clients. |
| * @noextend This class is not intended to be subclassed by clients. |
| */ |
| public class AntCorePlugin extends Plugin { |
| |
| /** |
| * Status code indicating an unexpected internal error. |
| * |
| * @since 2.1 |
| */ |
| public static final int INTERNAL_ERROR = 120; |
| |
| /** |
| * The single instance of this plug-in runtime class. |
| */ |
| private static AntCorePlugin plugin; |
| |
| /** |
| * The preferences class for this plug-in. |
| */ |
| private AntCorePreferences preferences; |
| |
| /** |
| * Unique identifier constant (value <code>"org.eclipse.ant.core"</code>) for the Ant Core plug-in. |
| */ |
| public static final String PI_ANTCORE = "org.eclipse.ant.core"; //$NON-NLS-1$ |
| |
| /** |
| * Simple identifier constant (value <code>"antTasks"</code>) for the Ant tasks extension point. |
| */ |
| public static final String PT_TASKS = "antTasks"; //$NON-NLS-1$ |
| |
| /** |
| * Simple identifier constant (value <code>"extraClasspathEntries"</code>) for the extra classpath entries extension point. |
| */ |
| public static final String PT_EXTRA_CLASSPATH = "extraClasspathEntries"; //$NON-NLS-1$ |
| |
| /** |
| * Simple identifier constant (value <code>"antTypes"</code>) for the Ant types extension point. |
| */ |
| public static final String PT_TYPES = "antTypes"; //$NON-NLS-1$ |
| |
| /** |
| * Simple identifier constant (value <code>"antProperties"</code>) for the Ant properties extension point. |
| * |
| * @since 3.0 |
| */ |
| public static final String PT_PROPERTIES = "antProperties"; //$NON-NLS-1$ |
| |
| /** |
| * Simple identifier constant (value <code>"org.eclipse.ant.core.antBuildFile"</code>) for the content type of an Ant BuildFile |
| * |
| * @since 3.0 |
| */ |
| public static final String ANT_BUILDFILE_CONTENT_TYPE = PI_ANTCORE + ".antBuildFile"; //$NON-NLS-1$ |
| |
| /** |
| * Simple identifier constant (value <code>"class"</code>) of a tag that appears in Ant extensions. |
| */ |
| public static final String CLASS = "class"; //$NON-NLS-1$ |
| |
| /** |
| * Simple identifier constant (value <code>"name"</code>) of a tag that appears in Ant extensions. |
| */ |
| public static final String NAME = "name"; //$NON-NLS-1$ |
| |
| /** |
| * Simple identifier constant (value <code>"library"</code>) of a tag that appears in Ant extensions. |
| */ |
| public static final String LIBRARY = "library"; //$NON-NLS-1$ |
| |
| /** |
| * Simple identifier constant (value <code>"headless"</code>) of a tag that appears in Ant extensions. |
| * |
| * @since 2.1 |
| */ |
| public static final String HEADLESS = "headless"; //$NON-NLS-1$ |
| |
| /** |
| * Simple identifier constant (value <code>"eclipseRuntime"</code>) of a tag that appears in Ant extensions. |
| * |
| * @since 3.0 |
| */ |
| public static final String ECLIPSE_RUNTIME = "eclipseRuntime"; //$NON-NLS-1$ |
| |
| /** |
| * Simple identifier constant (value <code>"uri"</code>) of a tag that appears in Ant extensions. |
| * |
| * @since 3.2 |
| */ |
| public static final String URI = "uri"; //$NON-NLS-1$ |
| |
| /** |
| * Simple identifier constant (value <code>"value"</code>) of a tag that appears in Ant extensions. |
| * |
| * @since 3.0 |
| */ |
| public static final String VALUE = "value"; //$NON-NLS-1$ |
| |
| /** |
| * Key to access the <code>IProgressMonitor</code> reference. When a progress monitor is passed to the |
| * <code>AntRunner.run(IProgressMonitor)</code> method, the object is available as a reference for the current Ant project. |
| */ |
| public static final String ECLIPSE_PROGRESS_MONITOR = "eclipse.progress.monitor"; //$NON-NLS-1$ |
| |
| /** |
| * Status code indicating an error occurred running a build. |
| * |
| * @since 2.1 |
| */ |
| public static final int ERROR_RUNNING_BUILD = 1; |
| |
| /** |
| * Status code indicating an error occurred due to a malformed URL. |
| * |
| * @since 2.1 |
| */ |
| public static final int ERROR_MALFORMED_URL = 2; |
| |
| /** |
| * Status code indicating an error occurred as a library was not specified |
| * |
| * @since 2.1 |
| */ |
| public static final int ERROR_LIBRARY_NOT_SPECIFIED = 3; |
| |
| /** |
| * Constructs an instance of this plug-in runtime class. |
| * <p> |
| * An instance of this plug-in runtime class is automatically created when the facilities provided by the Ant Core plug-in are required. |
| * <b>Clients must never explicitly instantiate a plug-in runtime class.</b> |
| * </p> |
| * |
| * @since 3.1 |
| * |
| */ |
| public AntCorePlugin() { |
| plugin = this; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) |
| * |
| * @since 3.1 |
| */ |
| @Override |
| @SuppressWarnings("deprecation") |
| public void stop(BundleContext context) throws Exception { |
| super.stop(context); |
| AntCoreUtil.setBundleContext(null); |
| if (preferences != null) { |
| savePluginPreferences(); |
| } |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) |
| * |
| * @since 3.1 |
| */ |
| @Override |
| public void start(BundleContext context) throws Exception { |
| super.start(context); |
| AntCoreUtil.setBundleContext(context); |
| } |
| |
| /** |
| * Given an extension point name, extract its extensions and return them as a List. |
| * |
| * @param pointName |
| * The name of the extension point |
| * @return The list of the extensions |
| */ |
| private List<IConfigurationElement> extractExtensions(String pointName) { |
| IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(AntCorePlugin.PI_ANTCORE, pointName); |
| if (extensionPoint == null) { |
| return null; |
| } |
| IConfigurationElement[] extensions = extensionPoint.getConfigurationElements(); |
| return Arrays.asList(extensions); |
| } |
| |
| /** |
| * Returns an object representing this plug-in's preferences. |
| * |
| * @return the Ant core object representing the preferences for this plug-in. |
| */ |
| public AntCorePreferences getPreferences() { |
| if (preferences == null) { |
| preferences = new AntCorePreferences(extractExtensions(PT_TASKS), extractExtensions(PT_EXTRA_CLASSPATH), extractExtensions(PT_TYPES), extractExtensions(PT_PROPERTIES), false); |
| } |
| return preferences; |
| } |
| |
| /** |
| * Set this plug-in's preferences for running headless based on the headless parameter. This method is public for testing purposes only. It should |
| * not be called outside of the Ant integration framework. |
| * |
| * @param headless |
| * Whether or not to mark that the plug-in is running headless or not |
| */ |
| public void setRunningHeadless(boolean headless) { |
| preferences = new AntCorePreferences(extractExtensions(PT_TASKS), extractExtensions(PT_EXTRA_CLASSPATH), extractExtensions(PT_TYPES), extractExtensions(PT_PROPERTIES), headless); |
| } |
| |
| /** |
| * Returns this plug-in instance. |
| * |
| * @return the single instance of this plug-in runtime class |
| */ |
| public static AntCorePlugin getPlugin() { |
| return plugin; |
| } |
| |
| /** |
| * Returns a new class loader to use when executing Ant builds. |
| * |
| * @return the new class loader |
| */ |
| public ClassLoader getNewClassLoader() { |
| AntCorePreferences corePreferences = getPreferences(); |
| return getNewClassLoader(false, corePreferences.getURLs()); |
| } |
| |
| /** |
| * Returns a new class loader to use when executing Ant builds. |
| * |
| * @param urls |
| * the URLs that define the classpath of the new classloader |
| * @return the new class loader |
| * @since 3.1 |
| */ |
| public URLClassLoader getNewClassLoader(URL[] urls) { |
| return getNewClassLoader(false, urls); |
| } |
| |
| /** |
| * Returns a new class loader to use when executing Ant builds or other applications such as parsing or code proposal determination. |
| * |
| * @param allowLoading |
| * whether to allow plug-in classloaders associated with the new classloader to load Apache Ant classes or resources. |
| * @return the new class loader |
| */ |
| public ClassLoader getNewClassLoader(boolean allowLoading) { |
| AntCorePreferences corePreferences = getPreferences(); |
| URL[] urls = corePreferences.getURLs(); |
| return getNewClassLoader(allowLoading, urls); |
| } |
| |
| /** |
| * Returns a new class loader to use when executing Ant builds or other applications such as parsing or code proposal determination. |
| * |
| * @param allowLoading |
| * whether to allow plug-in classloaders associated with the new classloader to load Apache Ant classes or resources. |
| * @param urls |
| * the URLs that define the classpath of the new classloader |
| * @return the new class loader |
| * @since 3.1 |
| */ |
| public URLClassLoader getNewClassLoader(boolean allowLoading, URL[] urls) { |
| AntCorePreferences corePreferences = getPreferences(); |
| ClassLoader[] pluginLoaders = corePreferences.getPluginClassLoaders(); |
| AntClassLoader loader = new AntClassLoader(urls, pluginLoaders); |
| loader.allowPluginClassLoadersToLoadAnt(allowLoading); |
| return loader; |
| } |
| |
| /** |
| * Logs the specified throwable with this plug-in's log. |
| * |
| * @param t |
| * throwable to log |
| * @since 2.1 |
| */ |
| public static void log(Throwable t) { |
| IStatus status = new Status(IStatus.ERROR, PI_ANTCORE, INTERNAL_ERROR, "Error logged from Ant Core: ", t); //$NON-NLS-1$ |
| getPlugin().getLog().log(status); |
| } |
| } |