diff options
3 files changed, 27 insertions, 50 deletions
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxConfiguration.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxConfiguration.java index 9f181d11b..00a8670d7 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxConfiguration.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxConfiguration.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2003, 2020 IBM Corporation and others. + * Copyright (c) 2003, 2021 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -10,6 +10,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Hannes Wellmann - Bug 577497 - Support version-specific entries in dev-classPath file *******************************************************************************/ package org.eclipse.osgi.internal.framework; @@ -40,7 +41,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.Dictionary; import java.util.Enumeration; import java.util.HashMap; import java.util.LinkedHashMap; @@ -68,6 +68,7 @@ import org.eclipse.osgi.service.environment.EnvironmentInfo; import org.eclipse.osgi.util.ManifestElement; import org.eclipse.osgi.util.NLS; import org.osgi.framework.Version; +import org.osgi.framework.wiring.BundleRevision; /** * Internal class. @@ -96,6 +97,8 @@ public class EquinoxConfiguration implements EnvironmentInfo { public static final String VARIABLE_DELIM_STRING = "$"; //$NON-NLS-1$ public static final char VARIABLE_DELIM_CHAR = '$'; + private static final String DEV_FILE_ENTRY_VERSION_SEPARATOR = ";"; //$NON-NLS-1$ + private final ConfigValues configValues; private final Debug debug; @@ -113,7 +116,7 @@ public class EquinoxConfiguration implements EnvironmentInfo { private final File devLocation; private final Object devMonitor = new Object(); private String[] devDefaultClasspath; - private Dictionary<String, String> devProperties = null; + private Map<String, String> devProperties = null; // timestamp for the dev.properties file private long devLastModified = 0; @@ -882,25 +885,21 @@ public class EquinoxConfiguration implements EnvironmentInfo { * Updates the dev classpath if the file containing the entries have changed */ private void updateDevProperties() { - if (devLocation == null) - return; - synchronized (devMonitor) { - if (devLocation.lastModified() == devLastModified) - return; - + if (devLocation != null && devLocation.lastModified() != devLastModified) { try { loadDevProperties(new FileInputStream(devLocation)); - } catch (FileNotFoundException e) { - return; + devLastModified = devLocation.lastModified(); + } catch (FileNotFoundException e) { // ignore and try again next time } - devLastModified = devLocation.lastModified(); } } - private static String[] getDevClassPath(String id, Dictionary<String, String> properties, String[] defaultClasspath) { + private static String[] getDevClassPath(BundleRevision bundle, Map<String, String> properties, String[] defaultClasspath) { String[] result = null; + String id = bundle.getSymbolicName(); if (id != null && properties != null) { - String entry = properties.get(id); + String idVersion = id + DEV_FILE_ENTRY_VERSION_SEPARATOR + bundle.getVersion(); + String entry = properties.getOrDefault(idVersion, properties.get(id)); // prefer idVersion value if (entry != null) result = getArrayFromList(entry); } @@ -911,28 +910,14 @@ public class EquinoxConfiguration implements EnvironmentInfo { /** * Returns a list of classpath elements for the specified bundle symbolic name. - * @param id a bundle symbolic name to get the development classpath for - * @param properties a Dictionary of properties to use or <code>null</code> if - * the default develoment classpath properties should be used + * @param bundle a bundle revision to get the development classpath for * @return a list of development classpath elements */ - public String[] getDevClassPath(String id, Dictionary<String, String> properties) { - if (properties == null) { - synchronized (devMonitor) { - updateDevProperties(); - return getDevClassPath(id, devProperties, devDefaultClasspath); - } + public String[] getDevClassPath(BundleRevision bundle) { + synchronized (devMonitor) { + updateDevProperties(); + return getDevClassPath(bundle, devProperties, devDefaultClasspath); } - return getDevClassPath(id, properties, getArrayFromList(properties.get("*"))); //$NON-NLS-1$ - } - - /** - * Returns a list of classpath elements for the specified bundle symbolic name. - * @param id a bundle symbolic name to get the development classpath for - * @return a list of development classpath elements - */ - public String[] getDevClassPath(String id) { - return getDevClassPath(id, null); } private static String[] getArrayFromList(String prop) { @@ -944,24 +929,16 @@ public class EquinoxConfiguration implements EnvironmentInfo { */ private void loadDevProperties(InputStream input) { Properties props = new Properties(); - try { - props.load(input); + try (InputStream inputStream = input) { + props.load(inputStream); } catch (IOException e) { exceptions.put(e, FrameworkLogEntry.ERROR); - } finally { - if (input != null) - try { - input.close(); - } catch (IOException e) { - // tried our best - } } - @SuppressWarnings({"unchecked", "rawtypes"}) - Dictionary<String, String> result = (Dictionary) props; + @SuppressWarnings({ "unchecked", "rawtypes" }) + Map<String, String> result = (Map) props; synchronized (devMonitor) { devProperties = result; - if (devProperties != null) - devDefaultClasspath = getArrayFromList(devProperties.get("*")); //$NON-NLS-1$ + devDefaultClasspath = getArrayFromList(devProperties.get("*")); //$NON-NLS-1$ } } diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/hooks/DevClassLoadingHook.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/hooks/DevClassLoadingHook.java index ca9a3e64b..c707e4c76 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/hooks/DevClassLoadingHook.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/hooks/DevClassLoadingHook.java @@ -49,11 +49,11 @@ public class DevClassLoadingHook extends ClassLoaderHook implements KeyedElement return false; } // first check that we are in devmode for this sourcedata - String[] devClassPaths = !configuration.inDevelopmentMode() ? null : configuration.getDevClassPath(sourceGeneration.getRevision().getSymbolicName()); + String[] devClassPaths = !configuration.inDevelopmentMode() ? null : configuration.getDevClassPath(sourceGeneration.getRevision()); if (devClassPaths == null || devClassPaths.length == 0) return false; // not in dev mode return // check that dev classpath entries have not already been added; we mark this in the first entry below - if (cpEntries.size() > 0 && cpEntries.get(0).getUserObject(KEY) != null) + if (!cpEntries.isEmpty() && cpEntries.get(0).getUserObject(KEY) != null) return false; // this source has already had its dev classpath entries added. // get the specified classpath from the Bundle-ClassPath header to check for dups @@ -105,7 +105,7 @@ public class DevClassLoadingHook extends ClassLoaderHook implements KeyedElement } // mark the first entry of the list. // This way we can quickly tell that dev classpath entries have been added to the list - if (result && cpEntries.size() > 0) + if (result && !cpEntries.isEmpty()) cpEntries.get(0).addUserObject(this); return result; } diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/FrameworkExtensionInstaller.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/FrameworkExtensionInstaller.java index 52a4854eb..34e7e1c9f 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/FrameworkExtensionInstaller.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/FrameworkExtensionInstaller.java @@ -194,7 +194,7 @@ public class FrameworkExtensionInstaller { if (configuration.inDevelopmentMode()) { // must create a copy because paths could be unmodifiable paths = new ArrayList<>(paths); - String[] devPaths = configuration.getDevClassPath(revision.getSymbolicName()); + String[] devPaths = configuration.getDevClassPath(revision); Collections.addAll(paths, devPaths); } List<File> results = new ArrayList<>(paths.size()); |