Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java34
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxConfiguration.java37
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainer.java1
-rwxr-xr-xbundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/location/EquinoxLocations.java14
4 files changed, 73 insertions, 13 deletions
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java
index 5129c9f41..3eb8f25d8 100755
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java
@@ -39,6 +39,7 @@ import org.osgi.framework.namespace.NativeNamespace;
import org.osgi.framework.wiring.*;
import org.osgi.resource.Capability;
import org.osgi.resource.Requirement;
+import org.osgi.service.log.*;
import org.osgi.service.packageadmin.ExportedPackage;
import org.osgi.service.packageadmin.PackageAdmin;
import org.osgi.service.startlevel.StartLevel;
@@ -3094,4 +3095,37 @@ public class SystemBundleTests extends AbstractBundleTests {
}
}
}
+
+ public void testOverrideEquinoxConfigAreaProp() {
+ File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$
+ Map configuration = new HashMap();
+ configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
+ configuration.put(EquinoxLocations.PROP_CONFIG_AREA, config.getAbsolutePath() + "-override");
+ configuration.put(EquinoxConfiguration.PROP_LOG_HISTORY_MAX, "10");
+ Equinox equinox = null;
+ try {
+ equinox = new Equinox(configuration);
+ equinox.init();
+ BundleContext bc = equinox.getBundleContext();
+ LogReaderService logReader = bc.getService(bc.getServiceReference(LogReaderService.class));
+ Enumeration<LogEntry> logs = logReader.getLog();
+ assertTrue("No logs found.", logs.hasMoreElements());
+ LogEntry entry = logs.nextElement();
+ assertEquals("Wrong log level.", LogLevel.WARN, entry.getLogLevel());
+ assertTrue("Wrong message found: " + entry.getMessage(), entry.getMessage().contains(EquinoxLocations.PROP_CONFIG_AREA));
+ } catch (BundleException e) {
+ fail("Failed init", e);
+ } finally {
+ try {
+ if (equinox != null) {
+ equinox.stop();
+ equinox.waitForStop(1000);
+ }
+ } catch (BundleException e) {
+ fail("Failed to stop framework.", e);
+ } catch (InterruptedException e) {
+ fail("Failed to stop framework.", e);
+ }
+ }
+ }
}
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 7283c00c5..0ce16cda6 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, 2016 IBM Corporation and others.
+ * Copyright (c) 2003, 2017 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
@@ -30,11 +30,13 @@ import java.security.ProtectionDomain;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.core.runtime.internal.adaptor.ConsoleManager;
+import org.eclipse.osgi.framework.log.FrameworkLogEntry;
import org.eclipse.osgi.internal.debug.Debug;
import org.eclipse.osgi.internal.debug.FrameworkDebugOptions;
import org.eclipse.osgi.internal.hookregistry.HookRegistry;
import org.eclipse.osgi.internal.location.EquinoxLocations;
import org.eclipse.osgi.internal.location.LocationHelper;
+import org.eclipse.osgi.internal.log.EquinoxLogServices;
import org.eclipse.osgi.internal.messages.Msg;
import org.eclipse.osgi.service.datalocation.Location;
import org.eclipse.osgi.service.debug.DebugOptions;
@@ -112,6 +114,8 @@ public class EquinoxConfiguration implements EnvironmentInfo {
public final boolean CLASS_CERTIFICATE;
public final boolean PARALLEL_CAPABLE;
+ private final Map<Throwable, Integer> exceptions = new LinkedHashMap<>(0);
+
// JVM os.arch property name
public static final String PROP_JVM_OS_ARCH = "os.arch"; //$NON-NLS-1$
// JVM os.name property name
@@ -230,7 +234,10 @@ public class EquinoxConfiguration implements EnvironmentInfo {
private final Map<String, Object> initialConfig;
private final Properties localConfig;
- public ConfigValues(Map<String, ?> initialConfiguration) {
+ private final Map<Throwable, Integer> exceptions;
+
+ public ConfigValues(Map<String, ?> initialConfiguration, Map<Throwable, Integer> exceptions) {
+ this.exceptions = exceptions;
this.initialConfig = initialConfiguration == null ? new HashMap<String, Object>(0) : new HashMap<>(initialConfiguration);
Object useSystemPropsValue = initialConfig.get(PROP_USE_SYSTEM_PROPERTIES);
this.useSystemProperties = useSystemPropsValue == null ? false : Boolean.parseBoolean(useSystemPropsValue.toString());
@@ -288,7 +295,7 @@ public class EquinoxConfiguration implements EnvironmentInfo {
// Verify type compatibility.
Long.parseLong(getConfiguration(PROP_STATE_SAVE_DELAY_INTERVAL));
} catch (NumberFormatException e) {
- // TODO Consider logging here.
+ exceptions.put(e, FrameworkLogEntry.ERROR);
// The specified value is not type compatible. Use the default.
setConfiguration(PROP_STATE_SAVE_DELAY_INTERVAL, DEFAULT_STATE_SAVE_DELAY_INTERVAL);
}
@@ -329,9 +336,12 @@ public class EquinoxConfiguration implements EnvironmentInfo {
} finally {
in.close();
}
+ } catch (FileNotFoundException e) {
+ // TODO probably should log, but the common case for non-eclipse
+ // environments would be to not have a config.ini ...
} catch (IOException e) {
- // its ok if there is no file. We'll just use the defaults for everything
- // TODO but it might be nice to log something with gentle wording (i.e., it is not an error)
+ // We'll just use the defaults for everything but log the exception on reading
+ exceptions.put(e, FrameworkLogEntry.WARNING);
}
return substituteVars(result);
}
@@ -497,15 +507,15 @@ public class EquinoxConfiguration implements EnvironmentInfo {
// Care must be taken to bootstrap of the config values properly
// A separate class is used to hold the configuration maps so that we can pass them
// to the EquionxLocations before the EquinoxConfiguration has been fully constructed
- this.configValues = new ConfigValues(initialConfiguration);
+ this.configValues = new ConfigValues(initialConfiguration, exceptions);
// We need to initialize some properties always before constructing the EquinoxLocations
initializeProperties();
- // At this point we do not know if we want to debug locations because we have not detemined if osgi.debug is set yet
+ // At this point we do not know if we want to debug locations because we have not determined if osgi.debug is set yet
// We use an AttomicBoolean to hold the setting so we can set it after the config.ini has been loaded
AtomicBoolean debugLocations = new AtomicBoolean();
- this.equinoxLocations = new EquinoxLocations(this.configValues, this.hookRegistry.getContainer(), debugLocations);
+ this.equinoxLocations = new EquinoxLocations(this.configValues, this.hookRegistry.getContainer(), debugLocations, exceptions);
this.configValues.loadConfigIni(getConfigIni(equinoxLocations, false));
this.configValues.loadConfigIni(getConfigIni(equinoxLocations, true));
this.configValues.finalizeValues();
@@ -535,7 +545,7 @@ public class EquinoxConfiguration implements EnvironmentInfo {
loadDevProperties(LocationHelper.getStream(location));
devMode = true;
} catch (IOException e) {
- // TODO consider logging
+ exceptions.put(e, FrameworkLogEntry.ERROR);
}
} catch (MalformedURLException e) {
@@ -858,7 +868,7 @@ public class EquinoxConfiguration implements EnvironmentInfo {
try {
props.load(input);
} catch (IOException e) {
- // TODO consider logging here
+ exceptions.put(e, FrameworkLogEntry.ERROR);
} finally {
if (input != null)
try {
@@ -1159,4 +1169,11 @@ public class EquinoxConfiguration implements EnvironmentInfo {
public EquinoxLocations getEquinoxLocations() {
return equinoxLocations;
}
+
+ void logMessages(EquinoxLogServices logServices) {
+ for (Map.Entry<Throwable, Integer> exception : exceptions.entrySet()) {
+ logServices.log(EquinoxContainer.NAME, exception.getValue(), exception.getKey().getMessage(), exception.getKey());
+ }
+ exceptions.clear();
+ }
}
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainer.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainer.java
index b81704cc6..4312a0f73 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainer.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainer.java
@@ -63,6 +63,7 @@ public class EquinoxContainer implements ThreadFactory, Runnable {
public EquinoxContainer(Map<String, ?> configuration) {
this.equinoxConfig = new EquinoxConfiguration(configuration, new HookRegistry(this));
this.logServices = new EquinoxLogServices(this.equinoxConfig);
+ this.equinoxConfig.logMessages(this.logServices);
this.equinoxConfig.getHookRegistry().initialize();
try {
this.storage = Storage.createStorage(this);
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/location/EquinoxLocations.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/location/EquinoxLocations.java
index 8d623a74a..1869cfdfa 100755
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/location/EquinoxLocations.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/location/EquinoxLocations.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2004, 2016 IBM Corporation and others.
+ * Copyright (c) 2004, 2017 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
@@ -14,8 +14,10 @@ package org.eclipse.osgi.internal.location;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
+import java.util.Map;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
+import org.eclipse.osgi.framework.log.FrameworkLogEntry;
import org.eclipse.osgi.internal.framework.EquinoxConfiguration;
import org.eclipse.osgi.internal.framework.EquinoxConfiguration.ConfigValues;
import org.eclipse.osgi.internal.framework.EquinoxContainer;
@@ -69,7 +71,7 @@ public class EquinoxLocations {
private final Location instanceLocation;
private final Location eclipseHomeLocation;
- public EquinoxLocations(ConfigValues equinoxConfig, EquinoxContainer container, AtomicBoolean debugLocations) {
+ public EquinoxLocations(ConfigValues equinoxConfig, EquinoxContainer container, AtomicBoolean debugLocations, Map<Throwable, Integer> exceptions) {
this.equinoxConfig = equinoxConfig;
this.container = container;
this.debugLocations = debugLocations;
@@ -77,8 +79,14 @@ public class EquinoxLocations {
// Initializes the Location objects for the LocationManager.
// set the osgi storage area if it exists
String osgiStorage = equinoxConfig.getConfiguration(Constants.FRAMEWORK_STORAGE);
- if (osgiStorage != null)
+ if (osgiStorage != null) {
+ if (equinoxConfig.getConfiguration(PROP_CONFIG_AREA) != null) {
+ exceptions.put(new IllegalArgumentException(String.format( //
+ "The property '%s' with the value '%s' is being overriden by the OSGi standard configuration property '%s' with the value '%s'.", //$NON-NLS-1$
+ PROP_CONFIG_AREA, equinoxConfig.getConfiguration(PROP_CONFIG_AREA), Constants.FRAMEWORK_STORAGE, osgiStorage)), FrameworkLogEntry.WARNING);
+ }
equinoxConfig.setConfiguration(PROP_CONFIG_AREA, osgiStorage);
+ }
// 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, null); //$NON-NLS-1$

Back to the top