diff options
author | Thomas Watson | 2010-01-08 22:49:57 +0000 |
---|---|---|
committer | Thomas Watson | 2010-01-08 22:49:57 +0000 |
commit | f683b85bb9dfc02038965eeb637c43747fb1ab98 (patch) | |
tree | 88dfc4056d8ac178be0ad67fdde2b24b647e6d4c /bundles | |
parent | aceb073cec7aae53502521a6e1b79ab5b6de64d9 (diff) | |
download | rt.equinox.framework-f683b85bb9dfc02038965eeb637c43747fb1ab98.tar.gz rt.equinox.framework-f683b85bb9dfc02038965eeb637c43747fb1ab98.tar.xz rt.equinox.framework-f683b85bb9dfc02038965eeb637c43747fb1ab98.zip |
Diffstat (limited to 'bundles')
6 files changed, 115 insertions, 21 deletions
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/services/datalocation/BasicLocationTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/services/datalocation/BasicLocationTests.java index 6cc19fa79..5012f19ed 100644 --- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/services/datalocation/BasicLocationTests.java +++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/services/datalocation/BasicLocationTests.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2009 IBM Corporation and others. + * 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 @@ -175,6 +175,59 @@ public class BasicLocationTests extends CoreTest { } } + private static final String INSTANCE_DATA_AREA_PREFIX = ".metadata/.plugins/"; //$NON-NLS-1$ + + public void testLocationDataArea01() { + Location instance = LocationManager.getInstanceLocation(); + doAllTestLocationDataArea(instance, INSTANCE_DATA_AREA_PREFIX); + + Location configuration = LocationManager.getConfigurationLocation(); + doAllTestLocationDataArea(configuration, ""); + } + + private void doAllTestLocationDataArea(Location location, String dataAreaPrefix) { + doTestLocateDataArea(location, dataAreaPrefix, getName()); + doTestLocateDataArea(location, dataAreaPrefix, ""); + doTestLocateDataArea(location, dataAreaPrefix, "test/multiple/paths"); + doTestLocateDataArea(location, dataAreaPrefix, "test/multiple/../paths"); + doTestLocateDataArea(location, dataAreaPrefix, "test\\multiple\\paths"); + + File testLocationFile = OSGiTestsActivator.getContext().getDataFile("testLocations/" + getName()); + Location createdLocation = location.createLocation(null, null, false); + try { + createdLocation.set(testLocationFile.toURL(), false); + } catch (Exception e) { + fail("Failed to set location", e); + } + doTestLocateDataArea(createdLocation, dataAreaPrefix, getName()); + doTestLocateDataArea(createdLocation, dataAreaPrefix, ""); + doTestLocateDataArea(createdLocation, dataAreaPrefix, "test/multiple/paths"); + doTestLocateDataArea(createdLocation, dataAreaPrefix, "test/multiple/../paths"); + doTestLocateDataArea(location, dataAreaPrefix, "test\\multiple\\paths"); + + createdLocation = location.createLocation(null, null, false); + try { + createdLocation.getDataArea("shouldFail"); + fail("expected failure when location is not set"); + } catch (IOException e) { + // expected; + } + } + + private void doTestLocateDataArea(Location location, String dataAreaPrefix, String namespace) { + assertTrue("Location is not set", location.isSet()); + URL dataArea = null; + try { + dataArea = location.getDataArea(namespace); + } catch (IOException e) { + fail("Failed to get data area.", e); + } + assertNotNull("Data area is null.", dataArea); + + namespace = namespace.replace('\\', '/'); + assertTrue("Data area is not the expected value: " + dataArea.toExternalForm(), dataArea.toExternalForm().endsWith(dataAreaPrefix + namespace)); + } + public void testSetLocationWithEmptyLockFile() { Location configLocation = LocationManager.getConfigurationLocation(); File testLocationFile = OSGiTestsActivator.getContext().getDataFile("testLocations/testSetLocationWithEmptyLockFile"); //$NON-NLS-1$ diff --git a/bundles/org.eclipse.osgi/META-INF/MANIFEST.MF b/bundles/org.eclipse.osgi/META-INF/MANIFEST.MF index a651b5909..887526b03 100644 --- a/bundles/org.eclipse.osgi/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.osgi/META-INF/MANIFEST.MF @@ -5,7 +5,7 @@ Export-Package: org.eclipse.osgi.event;version="1.0", org.eclipse.osgi.framework.eventmgr;version="1.2", org.eclipse.osgi.framework.log;version="1.0", org.eclipse.osgi.launch; version="1.0", - org.eclipse.osgi.service.datalocation;version="1.2", + org.eclipse.osgi.service.datalocation;version="1.3", org.eclipse.osgi.service.debug;version="1.1", org.eclipse.osgi.service.environment;version="1.3", org.eclipse.osgi.service.localization;version="1.1", diff --git a/bundles/org.eclipse.osgi/eclipseAdaptor/src/org/eclipse/core/runtime/adaptor/LocationManager.java b/bundles/org.eclipse.osgi/eclipseAdaptor/src/org/eclipse/core/runtime/adaptor/LocationManager.java index bfcb15802..354863e2c 100644 --- a/bundles/org.eclipse.osgi/eclipseAdaptor/src/org/eclipse/core/runtime/adaptor/LocationManager.java +++ b/bundles/org.eclipse.osgi/eclipseAdaptor/src/org/eclipse/core/runtime/adaptor/LocationManager.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2008 IBM Corporation and others. + * 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 @@ -73,6 +73,8 @@ public class LocationManager { 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 * @param spec the URL specification @@ -103,34 +105,35 @@ public class LocationManager { public static void initializeLocations() { // do install location initialization first since others may depend on it // assumes that the property is already set - installLocation = buildLocation(PROP_INSTALL_AREA, null, "", true, false); //$NON-NLS-1$ + installLocation = buildLocation(PROP_INSTALL_AREA, null, "", true, false, null); //$NON-NLS-1$ - Location temp = buildLocation(PROP_USER_AREA_DEFAULT, null, "", false, false); //$NON-NLS-1$ + // TODO not sure what the data area prefix should be here for the user area + Location temp = buildLocation(PROP_USER_AREA_DEFAULT, null, "", false, false, null); //$NON-NLS-1$ URL defaultLocation = temp == null ? null : temp.getURL(); if (defaultLocation == null) defaultLocation = buildURL(new File(FrameworkProperties.getProperty(PROP_USER_HOME), "user").getAbsolutePath(), true); //$NON-NLS-1$ - userLocation = buildLocation(PROP_USER_AREA, defaultLocation, "", false, false); //$NON-NLS-1$ + userLocation = buildLocation(PROP_USER_AREA, defaultLocation, "", false, false, null); //$NON-NLS-1$ - temp = buildLocation(PROP_INSTANCE_AREA_DEFAULT, null, "", false, false); //$NON-NLS-1$ + temp = buildLocation(PROP_INSTANCE_AREA_DEFAULT, null, "", false, false, INSTANCE_DATA_AREA_PREFIX); //$NON-NLS-1$ defaultLocation = temp == null ? null : temp.getURL(); if (defaultLocation == null) defaultLocation = buildURL(new File(FrameworkProperties.getProperty(PROP_USER_DIR), "workspace").getAbsolutePath(), true); //$NON-NLS-1$ - instanceLocation = buildLocation(PROP_INSTANCE_AREA, defaultLocation, "", false, false); //$NON-NLS-1$ + instanceLocation = buildLocation(PROP_INSTANCE_AREA, defaultLocation, "", false, false, INSTANCE_DATA_AREA_PREFIX); //$NON-NLS-1$ mungeConfigurationLocation(); // compute a default but it is very unlikely to be used since main will have computed everything - temp = buildLocation(PROP_CONFIG_AREA_DEFAULT, null, "", false, false); //$NON-NLS-1$ + temp = buildLocation(PROP_CONFIG_AREA_DEFAULT, null, "", false, false, null); //$NON-NLS-1$ defaultLocation = temp == null ? null : temp.getURL(); if (defaultLocation == null && FrameworkProperties.getProperty(PROP_CONFIG_AREA) == null) // only compute the default if the configuration area property is not set defaultLocation = buildURL(computeDefaultConfigurationLocation(), true); - configurationLocation = buildLocation(PROP_CONFIG_AREA, defaultLocation, "", false, false); //$NON-NLS-1$ + configurationLocation = buildLocation(PROP_CONFIG_AREA, defaultLocation, "", false, false, null); //$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. URL parentLocation = computeSharedConfigurationLocation(); if (parentLocation != null && !parentLocation.equals(configurationLocation.getURL())) { - Location parent = new BasicLocation(null, parentLocation, true); + Location parent = new BasicLocation(null, parentLocation, true, null); ((BasicLocation) configurationLocation).setParent(parent); } initializeDerivedConfigurationLocations(); @@ -144,7 +147,7 @@ public class LocationManager { // if eclipse.home.location is not set then default to osgi.install.area if (FrameworkProperties.getProperty(PROP_HOME_LOCATION_AREA) == null && FrameworkProperties.getProperty(PROP_INSTALL_AREA) != null) FrameworkProperties.setProperty(PROP_HOME_LOCATION_AREA, FrameworkProperties.getProperty(PROP_INSTALL_AREA)); - eclipseHomeLocation = buildLocation(PROP_HOME_LOCATION_AREA, null, "", true, true); //$NON-NLS-1$ + eclipseHomeLocation = buildLocation(PROP_HOME_LOCATION_AREA, null, "", true, true, null); //$NON-NLS-1$ } private static String getEclipseHomeLocation(String launcher) { @@ -174,7 +177,7 @@ public class LocationManager { return launcherParent == null ? null : new File(launcherParent); } - private static Location buildLocation(String property, URL defaultLocation, String userDefaultAppendage, boolean readOnlyDefault, boolean computeReadOnly) { + private static Location buildLocation(String property, URL defaultLocation, String userDefaultAppendage, boolean readOnlyDefault, boolean computeReadOnly, String dataAreaPrefix) { String location = FrameworkProperties.clearProperty(property); // the user/product may specify a non-default readOnly setting String userReadOnlySetting = FrameworkProperties.getProperty(property + READ_ONLY_AREA_SUFFIX); @@ -182,12 +185,12 @@ public class LocationManager { // 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(property, defaultLocation, userReadOnlySetting != null || !computeReadOnly ? readOnly : !canWrite(defaultLocation)); + return new BasicLocation(property, defaultLocation, userReadOnlySetting != null || !computeReadOnly ? readOnly : !canWrite(defaultLocation), dataAreaPrefix); String trimmedLocation = location.trim(); if (trimmedLocation.equalsIgnoreCase(NONE)) return null; if (trimmedLocation.equalsIgnoreCase(NO_DEFAULT)) - return new BasicLocation(property, null, readOnly); + return new BasicLocation(property, null, readOnly, dataAreaPrefix); if (trimmedLocation.startsWith(USER_HOME)) { String base = substituteVar(location, USER_HOME, PROP_USER_HOME); location = new File(base, userDefaultAppendage).getAbsolutePath(); @@ -198,7 +201,7 @@ public class LocationManager { URL url = buildURL(location, true); BasicLocation result = null; if (url != null) { - result = new BasicLocation(property, null, userReadOnlySetting != null || !computeReadOnly ? readOnly : !canWrite(url)); + result = new BasicLocation(property, null, userReadOnlySetting != null || !computeReadOnly ? readOnly : !canWrite(url), dataAreaPrefix); result.setURL(url, false); } return result; diff --git a/bundles/org.eclipse.osgi/supplement/META-INF/MANIFEST.MF b/bundles/org.eclipse.osgi/supplement/META-INF/MANIFEST.MF index fab062d9e..d8ff0dee5 100644 --- a/bundles/org.eclipse.osgi/supplement/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.osgi/supplement/META-INF/MANIFEST.MF @@ -6,7 +6,7 @@ Bundle-Version: 1.3.0.qualifier Bundle-Vendor: %providerName Bundle-Localization: plugin Export-Package: org.eclipse.osgi.framework.log;version="1.0", - org.eclipse.osgi.service.datalocation;version="1.2", + org.eclipse.osgi.service.datalocation;version="1.3", org.eclipse.osgi.service.debug;version="1.1", org.eclipse.osgi.service.environment;version="1.3", org.eclipse.osgi.service.localization;version="1.1", diff --git a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/core/runtime/internal/adaptor/BasicLocation.java b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/core/runtime/internal/adaptor/BasicLocation.java index 7dba75f12..d73ef479a 100644 --- a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/core/runtime/internal/adaptor/BasicLocation.java +++ b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/core/runtime/internal/adaptor/BasicLocation.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2009 IBM Corporation and others. + * 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 @@ -43,6 +43,7 @@ public class BasicLocation implements Location { private Location parent; final private URL defaultValue; final private String property; + final private String dataAreaPrefix; // locking related fields private File lockFile; @@ -84,11 +85,12 @@ public class BasicLocation implements Location { } - public BasicLocation(String property, URL defaultValue, boolean isReadOnly) { + public BasicLocation(String property, URL defaultValue, boolean isReadOnly, String dataAreaPrefix) { super(); this.property = property; this.defaultValue = defaultValue; this.isReadOnly = isReadOnly; + this.dataAreaPrefix = dataAreaPrefix == null ? "" : dataAreaPrefix; //$NON-NLS-1$ } public boolean allowsDefault() { @@ -238,8 +240,21 @@ public class BasicLocation implements Location { } public Location createLocation(Location parentLocation, URL defaultLocation, boolean readonly) { - BasicLocation result = new BasicLocation(null, defaultLocation, readonly); + BasicLocation result = new BasicLocation(null, defaultLocation, readonly, dataAreaPrefix); result.setParent(parentLocation); return result; } + + public URL getDataArea(String filename) throws IOException { + URL base = getURL(); + if (base == null) + throw new IOException(EclipseAdaptorMsg.location_notSet); + String prefix = base.toExternalForm(); + if (prefix.length() > 0 && prefix.charAt(prefix.length() - 1) != '/') + prefix += '/'; + filename = filename.replace('\\', '/'); + if (filename.length() > 0 && filename.charAt(0) == '/') + filename.substring(1); + return new URL(prefix + dataAreaPrefix + filename); + } } diff --git a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/service/datalocation/Location.java b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/service/datalocation/Location.java index 29e52360f..8ae36588f 100644 --- a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/service/datalocation/Location.java +++ b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/service/datalocation/Location.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2009 IBM Corporation and others. + * 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 @@ -199,4 +199,27 @@ public interface Location { * @since 3.4 */ public Location createLocation(Location parent, URL defaultValue, boolean readonly); + + /** + * Returns a URL to the specified path within this location. The path + * of the returned URL may not exist yet. It is the responsibility of the + * client to create the content of the data area returned if it does not exist. + * <p> + * This method can be used to obtain a private area within the given location. + * For example use the symbolic name of a bundle to obtain a data area specific + * to that bundle. + * </p> + * <p> + * Clients should check if the location is read only before writing anything + * to the returned data area. An <code>IOException</code> will be thrown if + * this method is called and the location URL has not been set and there is + * no default value for this location. + * </p> + * + * @param path the name of the path to get from this location + * @return the URL to the data area with the specified path. + * @throws IOException if the location URL is not already set + * @since 3.6 + */ + public URL getDataArea(String path) throws IOException; } |