/******************************************************************************* * Copyright (c) 2000, 2009 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 * Serge Beauchamp (Freescale Semiconductor) - [252996] add PT_FILTER_PROVIDERS * Serge Beauchamp (Freescale Semiconductor) - [229633] add PT_VARIABLE_PROVIDERS *******************************************************************************/ package org.eclipse.core.resources; import org.eclipse.core.internal.resources.*; import org.eclipse.core.internal.utils.Messages; import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.jobs.IJobManager; import org.eclipse.core.runtime.jobs.Job; import org.osgi.framework.*; /** * The plug-in runtime class for the Resources plug-in. This is the starting point for all workspace * and resource manipulation. A typical sequence of events would be for a dependent plug-in to call * <code>ResourcesPlugin.getWorkspace()</code>. Doing so would cause this plug-in to be activated * and the workspace (if any) to be loaded from disk and initialized. * * @noinstantiate This class is not intended to be instantiated by clients. */ public final class ResourcesPlugin extends Plugin { /** * Unique identifier constant (value <code>"org.eclipse.core.resources"</code>) for the standard * Resources plug-in. */ public static final String PI_RESOURCES= "org.eclipse.core.resources"; //$NON-NLS-1$ /*==================================================================== * Constants defining the ids of the standard workspace extension points: *====================================================================*/ /** * Simple identifier constant (value <code>"builders"</code>) for the builders extension point. */ public static final String PT_BUILDERS= "builders"; //$NON-NLS-1$ /** * Simple identifier constant (value <code>"natures"</code>) for the natures extension point. */ public static final String PT_NATURES= "natures"; //$NON-NLS-1$ /** * Simple identifier constant (value <code>"markers"</code>) for the markers extension point. */ public static final String PT_MARKERS= "markers"; //$NON-NLS-1$ /** * Simple identifier constant (value <code>"fileModificationValidator"</code>) for the file * modification validator extension point. */ public static final String PT_FILE_MODIFICATION_VALIDATOR= "fileModificationValidator"; //$NON-NLS-1$ /** * Simple identifier constant (value <code>"moveDeleteHook"</code>) for the move/delete hook * extension point. * * @since 2.0 */ public static final String PT_MOVE_DELETE_HOOK= "moveDeleteHook"; //$NON-NLS-1$ /** * Simple identifier constant (value <code>"teamHook"</code>) for the team hook extension point. * * @since 2.1 */ public static final String PT_TEAM_HOOK= "teamHook"; //$NON-NLS-1$ /** * Simple identifier constant (value <code>"refreshProviders"</code>) for the auto-refresh * refresh providers extension point. * * @since 3.0 */ public static final String PT_REFRESH_PROVIDERS= "refreshProviders"; //$NON-NLS-1$ /** * Simple identifier constant (value <code>"modelProviders"</code>) for the model providers * extension point. * * @since 3.2 */ public static final String PT_MODEL_PROVIDERS= "modelProviders"; //$NON-NLS-1$ /** * Simple identifier constant (value <code>"variableProviders"</code>) for the variable * providers extension point. * * @since 3.6 */ public static final String PT_VARIABLE_PROVIDERS= "variableResolvers"; //$NON-NLS-1$ /** * Simple identifier constant (value <code>"filterMatchers"</code>) for the filter matchers * extension point. * * @since 3.6 */ public static final String PT_FILTER_MATCHERS= "filterMatchers"; //$NON-NLS-1$ /** * Constant identifying the job family identifier for the background autobuild job. * * @see IJobManager#join(Object, IProgressMonitor) * @since 3.0 */ public static final Object FAMILY_AUTO_BUILD= new Object(); /** * Constant identifying the job family identifier for the background auto-refresh job. * * @see IJobManager#join(Object, IProgressMonitor) * @since 3.1 */ public static final Object FAMILY_AUTO_REFRESH= new Object(); /** * Constant identifying the job family identifier for a background build job. All clients that * schedule background jobs for performing builds should include this job family in their * implementation of <code>belongsTo</code>. * * @see IJobManager#join(Object, IProgressMonitor) * @see Job#belongsTo(Object) * @since 3.0 */ public static final Object FAMILY_MANUAL_BUILD= new Object(); /** * Constant identifying the job family identifier for a background refresh job. All clients that * schedule background jobs for performing refreshing should include this job family in their * implementation of <code>belongsTo</code>. * * @see IJobManager#join(Object, IProgressMonitor) * @see Job#belongsTo(Object) * @since 3.4 */ public static final Object FAMILY_MANUAL_REFRESH= new Object(); /** * Name of a preference indicating the encoding to use when reading text files in the workspace. * The value is a string, and may be the default empty string, indicating that the file system * encoding should be used instead. The file system encoding can be retrieved using * <code>System.getProperty("file.encoding")</code>. There is also a convenience method * <code>getEncoding</code> which returns the value of this preference, or the file system * encoding if this preference is not set. * <p> * Note that there is no guarantee that the value is a supported encoding. Callers should be * prepared to handle <code>UnsupportedEncodingException</code> where this encoding is used. * </p> * * @see #getEncoding() * @see java.io.UnsupportedEncodingException */ public static final String PREF_ENCODING= "encoding"; //$NON-NLS-1$ /** * Common prefix for workspace preference names. * * @since 2.1 */ private static final String PREF_DESCRIPTION_PREFIX= "description."; //$NON-NLS-1$ /** * @deprecated Do not use. * @since 3.0 */ public static final String PREF_MAX_NOTIFICATION_DELAY= "maxnotifydelay"; //$NON-NLS-1$ /** * Name of a preference for configuring whether the workspace performs auto- builds. * * @see IWorkspaceDescription#isAutoBuilding() * @see IWorkspaceDescription#setAutoBuilding(boolean) * @since 2.1 */ public static final String PREF_AUTO_BUILDING= PREF_DESCRIPTION_PREFIX + "autobuilding"; //$NON-NLS-1$ /** * Name of a preference for configuring the order projects in the workspace are built. * * @see IWorkspaceDescription#getBuildOrder() * @see IWorkspaceDescription#setBuildOrder(String[]) * @since 2.1 */ public static final String PREF_BUILD_ORDER= PREF_DESCRIPTION_PREFIX + "buildorder"; //$NON-NLS-1$ /** * Name of a preference for configuring whether to use the workspace's default order for * building projects. * * @since 2.1 */ public static final String PREF_DEFAULT_BUILD_ORDER= PREF_DESCRIPTION_PREFIX + "defaultbuildorder"; //$NON-NLS-1$ /** * Name of a preference for configuring the maximum number of times that the workspace should * rebuild when builders affect projects that have already been built. * * @see IWorkspaceDescription#getMaxBuildIterations() * @see IWorkspaceDescription#setMaxBuildIterations(int) * @since 2.1 */ public static final String PREF_MAX_BUILD_ITERATIONS= PREF_DESCRIPTION_PREFIX + "maxbuilditerations"; //$NON-NLS-1$ /** * Name of a preference for configuring whether to apply the specified history size policy. * * @see IWorkspaceDescription#isApplyFileStatePolicy() * @see IWorkspaceDescription#setApplyFileStatePolicy(boolean) * @since 3.6 */ public static final String PREF_APPLY_FILE_STATE_POLICY= PREF_DESCRIPTION_PREFIX + "applyfilestatepolicy"; //$NON-NLS-1$ /** * Name of a preference for configuring the maximum number of milliseconds a file state should * be kept in the local history * * @see IWorkspaceDescription#getFileStateLongevity() * @see IWorkspaceDescription#setFileStateLongevity(long) * @since 2.1 */ public static final String PREF_FILE_STATE_LONGEVITY= PREF_DESCRIPTION_PREFIX + "filestatelongevity"; //$NON-NLS-1$ /** * Name of a preference for configuring the maximum permitted size of a file to be stored in the * local history * * @see IWorkspaceDescription#getMaxFileStateSize() * @see IWorkspaceDescription#setMaxFileStateSize(long) * @since 2.1 */ public static final String PREF_MAX_FILE_STATE_SIZE= PREF_DESCRIPTION_PREFIX + "maxfilestatesize"; //$NON-NLS-1$ /** * Name of a preference for configuring the maximum number of states per file that can be stored * in the local history. * * @see IWorkspaceDescription#getMaxFileStates() * @see IWorkspaceDescription#setMaxFileStates(int) * @since 2.1 */ public static final String PREF_MAX_FILE_STATES= PREF_DESCRIPTION_PREFIX + "maxfilestates"; //$NON-NLS-1$ /** * Name of a preference for configuring the amount of time in milliseconds between automatic * workspace snapshots * * @see IWorkspaceDescription#getSnapshotInterval() * @see IWorkspaceDescription#setSnapshotInterval(long) * @since 2.1 */ public static final String PREF_SNAPSHOT_INTERVAL= PREF_DESCRIPTION_PREFIX + "snapshotinterval"; //$NON-NLS-1$ /** * Name of a preference for turning off support for linked resources. When this preference is * set to "true", attempting to create linked resources will fail. * * @since 2.1 */ public static final String PREF_DISABLE_LINKING= PREF_DESCRIPTION_PREFIX + "disableLinking";//$NON-NLS-1$ /** * Name of a preference for configuring whether the workspace performs auto- refresh. * * @since 3.0 */ public static final String PREF_AUTO_REFRESH= "refresh.enabled"; //$NON-NLS-1$ /** * The single instance of this plug-in runtime class. */ private static ResourcesPlugin plugin; /** * The workspace managed by the single instance of this plug-in runtime class, or * <code>null</code> is there is none. */ private static Workspace workspace= null; private ServiceRegistration workspaceRegistration; /** * 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 Resources plug-in are required. <b>Clients must never explicitly instantiate * a plug-in runtime class.</b> * </p> */ public ResourcesPlugin() { plugin= this; } /** * Constructs a brand new workspace structure at the location in the local file system * identified by the given path and returns a new workspace object. * * @exception CoreException if the workspace structure could not be constructed. Reasons * include: * <ul> * <li>There is an existing workspace structure on at the given location in the * local file system. * <li>A file exists at the given location in the local file system. * <li>A directory could not be created at the given location in the local file * system. * </ul> */ private static void constructWorkspace() throws CoreException { new LocalMetaArea().createMetaArea(); } /** * Returns the encoding to use when reading text files in the workspace. This is the value of * the <code>PREF_ENCODING</code> preference, or the file system encoding ( * <code>System.getProperty("file.encoding")</code>) if the preference is not set. * <p> * Note that this method does not check whether the result is a supported encoding. Callers * should be prepared to handle <code>UnsupportedEncodingException</code> where this encoding is * used. * * @return the encoding to use when reading text files in the workspace * @see java.io.UnsupportedEncodingException */ public static String getEncoding() { String enc= getPlugin().getPluginPreferences().getString(PREF_ENCODING); if (enc == null || enc.length() == 0) { enc= System.getProperty("file.encoding"); //$NON-NLS-1$ } return enc; } /** * Returns the Resources plug-in. * * @return the single instance of this plug-in runtime class */ public static ResourcesPlugin getPlugin() { return plugin; } /** * Returns the workspace. The workspace is not accessible after the resources plug-in has * shutdown. * * @return the workspace that was created by the single instance of this plug-in class. */ public static IWorkspace getWorkspace() { if (workspace == null) throw new IllegalStateException(Messages.resources_workspaceClosed); return workspace; } /** * This implementation of the corresponding {@link BundleActivator} method closes the workspace * without saving. * * @see BundleActivator#stop(BundleContext) */ public void stop(BundleContext context) throws Exception { super.stop(context); if (workspace == null) return; workspaceRegistration.unregister(); // save the preferences for this plug-in getPlugin().savePluginPreferences(); workspace.close(null); // Forget workspace only if successfully closed, to // make it easier to debug cases where close() is failing. workspace= null; workspaceRegistration= null; } /** * This implementation of the corresponding {@link BundleActivator} method opens the workspace. * * @see BundleActivator#start(BundleContext) */ public void start(BundleContext context) throws Exception { super.start(context); if (!new LocalMetaArea().hasSavedWorkspace()) { constructWorkspace(); } Workspace.DEBUG= ResourcesPlugin.getPlugin().isDebugging(); // Remember workspace before opening, to // make it easier to debug cases where open() is failing. workspace= new Workspace(); PlatformURLResourceConnection.startup(workspace.getRoot().getLocation()); IStatus result= workspace.open(null); if (!result.isOK()) getLog().log(result); workspaceRegistration= context.registerService(IWorkspace.SERVICE_NAME, workspace, null); } }