Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (c) 2004, 2010 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.core.runtime.adaptor;
 
 import java.io.*;
 import java.net.URL;
This class is used to manage the various Locations for Eclipse.

Clients may not extend this class.

Since:
3.1
Noextend:
This class is not intended to be subclassed by clients.
 
 public class LocationManager {
 	private static Location installLocation = null;
 	private static Location configurationLocation = null;
 	private static Location userLocation = null;
 	private static Location instanceLocation = null;
 	private static Location eclipseHomeLocation = null;
 
 	public static final String READ_ONLY_AREA_SUFFIX = ".readOnly"//$NON-NLS-1$
 	public static final String PROP_INSTALL_AREA = "osgi.install.area"//$NON-NLS-1$
 	public static final String PROP_CONFIG_AREA = "osgi.configuration.area"//$NON-NLS-1$
 	public static final String PROP_CONFIG_AREA_DEFAULT = "osgi.configuration.area.default"//$NON-NLS-1$
 	public static final String PROP_SHARED_CONFIG_AREA = "osgi.sharedConfiguration.area"//$NON-NLS-1$
 	public static final String PROP_INSTANCE_AREA = "osgi.instance.area"//$NON-NLS-1$
 	public static final String PROP_INSTANCE_AREA_DEFAULT = "osgi.instance.area.default"//$NON-NLS-1$
 	public static final String PROP_USER_AREA = "osgi.user.area"//$NON-NLS-1$
 	public static final String PROP_USER_AREA_DEFAULT = "osgi.user.area.default"//$NON-NLS-1$
 	public static final String PROP_MANIFEST_CACHE = "osgi.manifest.cache"//$NON-NLS-1$
 	public static final String PROP_USER_HOME = "user.home"//$NON-NLS-1$
 	public static final String PROP_USER_DIR = "user.dir"//$NON-NLS-1$
 	public static final String PROP_HOME_LOCATION_AREA = "eclipse.home.location"//$NON-NLS-1$
 	static final String PROP_LAUNCHER = "eclipse.launcher"//$NON-NLS-1$
 
 	// configuration area file/dir names
 	public static final String BUNDLES_DIR = "bundles"//$NON-NLS-1$
 	public static final String STATE_FILE = ".state"//$NON-NLS-1$
 	public static final String LAZY_FILE = ".lazy"//$NON-NLS-1$
 	public static final String BUNDLE_DATA_FILE = ".bundledata"//$NON-NLS-1$
 	public static final String MANIFESTS_DIR = "manifests"//$NON-NLS-1$
 	public static final String CONFIG_FILE = "config.ini"//$NON-NLS-1$
 	public static final String ECLIPSE_PROPERTIES = "eclipse.properties"//$NON-NLS-1$
 
 	// Constants for configuration location discovery
 	private static final String ECLIPSE = "eclipse"//$NON-NLS-1$
 	private static final String PRODUCT_SITE_MARKER = ".eclipseproduct"//$NON-NLS-1$
 	private static final String PRODUCT_SITE_ID = "id"//$NON-NLS-1$
 	private static final String PRODUCT_SITE_VERSION = "version"//$NON-NLS-1$
 
 	private static final String CONFIG_DIR = "configuration"//$NON-NLS-1$
 
 	// Data mode constants for user, configuration and data locations.
 	private static final String NONE = "@none"//$NON-NLS-1$
 	private static final String NO_DEFAULT = "@noDefault"//$NON-NLS-1$
 	private static final String USER_HOME = "@user.home"//$NON-NLS-1$
 	private static final String USER_DIR = "@user.dir"//$NON-NLS-1$
 
 	private static final String INSTANCE_DATA_AREA_PREFIX = ".metadata/.plugins/"//$NON-NLS-1$
 
Builds a URL with the given specification

Parameters:
spec the URL specification
trailingSlash flag to indicate a trailing slash on the spec
Returns:
a URL
 
 	public static URL buildURL(String specboolean trailingSlash) {
 		return LocationHelper.buildURL(spectrailingSlash);
 	}
 
 	private static void mungeConfigurationLocation() {
 		// if the config property was set, munge it for backwards compatibility.
 		String location = FrameworkProperties.getProperty();
 		if (location != null) {
 			if (location.endsWith(".cfg")) { //$NON-NLS-1$
 				int index = location.lastIndexOf('/');
 				if (index < 0)
 					index = location.lastIndexOf('\\');
 				location = location.substring(0, index + 1);
 				FrameworkProperties.setProperty(location);
 			}
 		}
	}

Initializes the Location objects for the LocationManager.
	public static void initializeLocations() {
		// do install location initialization first since others may depend on it
		// assumes that the property is already set
		 = buildLocation(null""truefalsenull); //$NON-NLS-1$
		// TODO not sure what the data area prefix should be here for the user area
		Location temp = buildLocation(null""falsefalsenull); //$NON-NLS-1$
		URL defaultLocation = temp == null ? null : temp.getURL();
		if (defaultLocation == null)
			defaultLocation = buildURL(new File(FrameworkProperties.getProperty(), "user").getAbsolutePath(), true); //$NON-NLS-1$
		 = buildLocation(defaultLocation""falsefalsenull); //$NON-NLS-1$
		temp = buildLocation(null""falsefalse); //$NON-NLS-1$
		defaultLocation = temp == null ? null : temp.getURL();
		if (defaultLocation == null)
			defaultLocation = buildURL(new File(FrameworkProperties.getProperty(), "workspace").getAbsolutePath(), true); //$NON-NLS-1$
		 = buildLocation(defaultLocation""falsefalse); //$NON-NLS-1$
		// compute a default but it is very unlikely to be used since main will have computed everything
		temp = buildLocation(null""falsefalsenull); //$NON-NLS-1$
		defaultLocation = temp == null ? null : temp.getURL();
		if (defaultLocation == null && FrameworkProperties.getProperty() == null)
			// only compute the default if the configuration area property is not set
			defaultLocation = buildURL(computeDefaultConfigurationLocation(), true);
		 = buildLocation(defaultLocation""falsefalsenull); //$NON-NLS-1$
		// get the parent location based on the system property. This will have been set on the 
		// way in either by the caller/user or by main.  There will be no parent location if we are not 
		// cascaded.
		if (parentLocation != null && !parentLocation.equals(.getURL())) {
			Location parent = new BasicLocation(nullparentLocationtruenull);
		}
		if (FrameworkProperties.getProperty() == null) {
			String eclipseLauncher = FrameworkProperties.getProperty();
			String eclipseHomeLocationPath = getEclipseHomeLocation(eclipseLauncher);
			if (eclipseHomeLocationPath != null)
				FrameworkProperties.setProperty(eclipseHomeLocationPath);
		}
		// if eclipse.home.location is not set then default to osgi.install.area
		if (FrameworkProperties.getProperty() == null && FrameworkProperties.getProperty() != null)
			FrameworkProperties.setProperty(, FrameworkProperties.getProperty());
		 = buildLocation(null""truetruenull); //$NON-NLS-1$
	}
	private static String getEclipseHomeLocation(String launcher) {
		if (launcher == null)
			return null;
		File launcherFile = new File(launcher);
		if (launcherFile.getParent() == null)
			return null;
		File launcherDir = new File(launcherFile.getParent());
		// check for mac os; the os check is copied from EclipseEnvironmentInfo.
		if (macosx.equals(EclipseEnvironmentInfo.getDefault().getOS()))
			launcherDir = getMacOSEclipsoeHomeLocation(launcherDir);
		return (launcherDir.exists() && launcherDir.isDirectory()) ? launcherDir.getAbsolutePath() : null;
	}
	private static File getMacOSEclipsoeHomeLocation(File launcherDir) {
		// TODO for now we go up three directories from the launcher dir as long as the parent dir is named MacOS; is this always the case?
		// TODO not sure if case is important
		if (!launcherDir.getName().equalsIgnoreCase("macos")) //$NON-NLS-1$
			return launcherDir// don't do the up three stuff if not in macos directory
		String launcherParent = launcherDir.getParent();
		if (launcherParent != null)
			launcherParent = new File(launcherParent).getParent();
		if (launcherParent != null)
			launcherParent = new File(launcherParent).getParent();
		return launcherParent == null ? null : new File(launcherParent);
	}
	private static Location buildLocation(String propertyURL defaultLocationString userDefaultAppendageboolean readOnlyDefaultboolean computeReadOnlyString dataAreaPrefix) {
		String location = FrameworkProperties.clearProperty(property);
		// the user/product may specify a non-default readOnly setting   
		String userReadOnlySetting = FrameworkProperties.getProperty(property + );
		boolean readOnly = (userReadOnlySetting == null ? readOnlyDefault : Boolean.valueOf(userReadOnlySetting).booleanValue());
		// if the instance location is not set, predict where the workspace will be and 
		// put the instance area inside the workspace meta area.
		if (location == null)
			return new BasicLocation(propertydefaultLocationuserReadOnlySetting != null || !computeReadOnly ? readOnly : !canWrite(defaultLocation), dataAreaPrefix);
		String trimmedLocation = location.trim();
		if (trimmedLocation.equalsIgnoreCase())
			return null;
		if (trimmedLocation.equalsIgnoreCase())
			return new BasicLocation(propertynullreadOnlydataAreaPrefix);
		if (trimmedLocation.startsWith()) {
			location = new File(baseuserDefaultAppendage).getAbsolutePath();
else if (trimmedLocation.startsWith()) {
			String base = substituteVar(location);
			location = new File(baseuserDefaultAppendage).getAbsolutePath();
		}
		URL url = buildURL(locationtrue);
		BasicLocation result = null;
		if (url != null) {
			result = new BasicLocation(propertynulluserReadOnlySetting != null || !computeReadOnly ? readOnly : !canWrite(url), dataAreaPrefix);
			result.setURL(urlfalse);
		}
		return result;
	}
	private static String substituteVar(String sourceString varString prop) {
		String value = FrameworkProperties.getProperty(prop""); //$NON-NLS-1$
		return value + source.substring(var.length());
	}
	private static void initializeDerivedConfigurationLocations() {
		if (FrameworkProperties.getProperty() == null)
	}
		String property = FrameworkProperties.getProperty();
		if (property != null)
			return LocationHelper.buildURL(propertytrue);
		return null;
	}
		String property = FrameworkProperties.getProperty();
		if (property == null)
			return null;
		try {
			URL sharedConfigurationURL = LocationHelper.buildURL(propertytrue);
			if (sharedConfigurationURL == null)
				return null;
			if (sharedConfigurationURL.getPath().startsWith("/")) //$NON-NLS-1$
				// absolute
				return sharedConfigurationURL;
			URL installURL = .getURL();
			if (!sharedConfigurationURL.getProtocol().equals(installURL.getProtocol()))
				// different protocol
				return sharedConfigurationURL;
			sharedConfigurationURL = new URL(installURLsharedConfigurationURL.getPath());
			FrameworkProperties.setProperty(sharedConfigurationURL.toExternalForm());
catch (MalformedURLException e) {
			// do nothing here since it is basically impossible to get a bogus url 
		}
		return null;
	}
		// 1) We store the config state relative to the 'eclipse' directory if possible
		// 2) If this directory is read-only 
		//    we store the state in <user.home>/.eclipse/<application-id>_<version> where <user.home> 
		//    is unique for each local user, and <application-id> is the one 
		//    defined in .eclipseproduct marker file. If .eclipseproduct does not
		//    exist, use "eclipse" as the application-id.
		if (installURL != null && "file".equals(installURL.getProtocol())) { //$NON-NLS-1$
			File installDir = new File(installURL.getFile());
			File defaultConfigDir = new File(installDir);
			if (!defaultConfigDir.exists())
				defaultConfigDir.mkdirs();
			if (defaultConfigDir.exists() && AdaptorUtil.canWrite(defaultConfigDir))
				return defaultConfigDir.getAbsolutePath();
		}
		// We can't write in the eclipse install dir so try for some place in the user's home dir
	}
	private static boolean canWrite(URL location) {
		if (location != null && "file".equals(location.getProtocol())) { //$NON-NLS-1$
			File locationDir = new File(location.getFile());
			if (!locationDir.exists())
				locationDir.mkdirs();
			if (locationDir.exists() && AdaptorUtil.canWrite(locationDir))
				return true;
		}
		return false;
	}
	private static String computeDefaultUserAreaLocation(String pathAppendage) {
		//    we store the state in <user.home>/.eclipse/<application-id>_<version> where <user.home> 
		//    is unique for each local user, and <application-id> is the one 
		//    defined in .eclipseproduct marker file. If .eclipseproduct does not
		//    exist, use "eclipse" as the application-id.
		String installProperty = FrameworkProperties.getProperty();
		URL installURL = buildURL(installPropertytrue);
		if (installURL == null)
			return null;
		File installDir = new File(installURL.getFile());
		// compute an install dir hash to prevent configuration area collisions with other eclipse installs
		int hashCode;
		try {
			hashCode = installDir.getCanonicalPath().hashCode();
catch (IOException ioe) {
			// fall back to absolute path
			hashCode = installDir.getAbsolutePath().hashCode();
		}
		if (hashCode < 0)
			hashCode = -(hashCode);
		String installDirHash = String.valueOf(hashCode);
		String appName = "." + //$NON-NLS-1$
		File eclipseProduct = new File(installDir);
		if (eclipseProduct.exists()) {
			Properties props = new Properties();
			try {
				props.load(new FileInputStream(eclipseProduct));
				if (appId == null || appId.trim().length() == 0)
					appId = ;
				String appVersion = props.getProperty();
				if (appVersion == null || appVersion.trim().length() == 0)
					appVersion = ""//$NON-NLS-1$
				appName += . + appId + "_" + appVersion + "_" + installDirHash//$NON-NLS-1$ //$NON-NLS-2$
catch (IOException e) {
				// Do nothing if we get an exception.  We will default to a standard location 
				// in the user's home dir.
				// add the hash to help prevent collisions
				appName += . + installDirHash;
			}
else {
			// add the hash to help prevent collisions
			appName += . + installDirHash;
		}
		String userHome = FrameworkProperties.getProperty();
		return new File(userHomeappName + "/" + pathAppendage).getAbsolutePath(); //$NON-NLS-1$
	}

Returns the user Location object

Returns:
the user Location object
	public static Location getUserLocation() {
		return ;
	}

Returns the configuration Location object

Returns:
the configuration Location object
	public static Location getConfigurationLocation() {
	}

Returns the install Location object

Returns:
the install Location object
	public static Location getInstallLocation() {
	}

Returns the instance Location object

Returns:
the instance Location object
	public static Location getInstanceLocation() {
	}
	public static Location getEclipseHomeLocation() {
	}

Returns the File object under the configuration location used for the OSGi configuration

Returns:
the OSGi configuration directory
	public static File getOSGiConfigurationDir() {
		// TODO assumes the URL is a file: url
	}

Returns a file from the configuration area that can be used by the framework

Parameters:
filename the filename
Returns:
a file from the configuration area
	public static File getConfigurationFile(String filename) {
		if (!dir.exists())
			dir.mkdirs();
		return new File(dirfilename);
	}
New to GrepCode? Check out our FAQ X