Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Kaegi2008-03-04 21:01:30 +0000
committerSimon Kaegi2008-03-04 21:01:30 +0000
commit546fcf8b812668b562825189da020d95b5a6c48d (patch)
treeecf9673a934782b4265471aa9797802afeefef90 /bundles/org.eclipse.equinox.simpleconfigurator
parent795d1d536b9126e2ebf829a1c67f1b2efe5f3783 (diff)
downloadrt.equinox.p2-546fcf8b812668b562825189da020d95b5a6c48d.tar.gz
rt.equinox.p2-546fcf8b812668b562825189da020d95b5a6c48d.tar.xz
rt.equinox.p2-546fcf8b812668b562825189da020d95b5a6c48d.zip
Bug 221259 reconciler.dropins can cause a Bundle State Change exception
Diffstat (limited to 'bundles/org.eclipse.equinox.simpleconfigurator')
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/Activator.java8
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/ConfigApplier.java7
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/SimpleConfiguratorFactory.java29
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/SimpleConfiguratorImpl.java61
4 files changed, 72 insertions, 33 deletions
diff --git a/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/Activator.java b/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/Activator.java
index 0061207a3..333df29e7 100644
--- a/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/Activator.java
+++ b/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/Activator.java
@@ -40,18 +40,18 @@ import org.osgi.framework.*;
*/
public class Activator implements BundleActivator {
public final static boolean DEBUG = false;
- private SimpleConfiguratorImpl bundleConfigurator;
private ServiceRegistration configuratorRegistration;
private ServiceRegistration commandRegistration;
public void start(BundleContext context) throws Exception {
- bundleConfigurator = new SimpleConfiguratorImpl(context);
+ SimpleConfiguratorImpl bundleConfigurator = new SimpleConfiguratorImpl(context, context.getBundle());
bundleConfigurator.applyConfiguration();
Dictionary props = new Hashtable();
props.put(Constants.SERVICE_VENDOR, "Eclipse"); //$NON-NLS-1$
props.put(Constants.SERVICE_PID, SimpleConfiguratorConstants.TARGET_CONFIGURATOR_NAME);
- configuratorRegistration = context.registerService(Configurator.class.getName(), bundleConfigurator, props);
+ ServiceFactory configurationFactory = new SimpleConfiguratorFactory(context);
+ configuratorRegistration = context.registerService(Configurator.class.getName(), configurationFactory, props);
try {
if (null != context.getBundle().loadClass("org.eclipse.osgi.framework.console.CommandProvider")) //$NON-NLS-1$
@@ -74,7 +74,5 @@ public class Activator implements BundleActivator {
commandRegistration.unregister();
commandRegistration = null;
}
-
- this.bundleConfigurator = null;
}
}
diff --git a/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/ConfigApplier.java b/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/ConfigApplier.java
index 0f924ce23..5dc6f3729 100644
--- a/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/ConfigApplier.java
+++ b/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/ConfigApplier.java
@@ -27,8 +27,11 @@ class ConfigApplier {
private final boolean runningOnEquinox;
private boolean checkManifestBeforeInstall = false;
- ConfigApplier(BundleContext context, SimpleConfiguratorImpl configurator) {
+ private Bundle callingBundle;
+
+ ConfigApplier(BundleContext context, Bundle callingBundle) {
this.manipulatingContext = context;
+ this.callingBundle = callingBundle;
//String vendor = context.getProperty(Constants.FRAMEWORK_VENDOR);
//System.out.println("vendor=" + vendor);
this.runningOnEquinox = "Eclipse".equals(context.getProperty(Constants.FRAMEWORK_VENDOR)); //$NON-NLS-1$
@@ -279,7 +282,7 @@ class ConfigApplier {
private void startBundles(Bundle[] bundles) {
for (int i = 0; i < bundles.length; i++) {
Bundle bundle = bundles[i];
- if (bundle.getState() == Bundle.STARTING && (bundle == manipulatingContext.getBundle()))
+ if (bundle.getState() == Bundle.STARTING && (bundle == callingBundle || bundle == manipulatingContext.getBundle()))
continue;
try {
diff --git a/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/SimpleConfiguratorFactory.java b/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/SimpleConfiguratorFactory.java
new file mode 100644
index 000000000..7e8dbeb5d
--- /dev/null
+++ b/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/SimpleConfiguratorFactory.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2008 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.equinox.internal.simpleconfigurator;
+
+import org.osgi.framework.*;
+
+public class SimpleConfiguratorFactory implements ServiceFactory {
+ private BundleContext context;
+
+ public SimpleConfiguratorFactory(BundleContext context) {
+ this.context = context;
+ }
+
+ public Object getService(Bundle bundle, ServiceRegistration registration) {
+ return new SimpleConfiguratorImpl(context, bundle);
+ }
+
+ public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
+ // nothing to do
+ }
+}
diff --git a/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/SimpleConfiguratorImpl.java b/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/SimpleConfiguratorImpl.java
index 2290c2812..47db7c7db 100644
--- a/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/SimpleConfiguratorImpl.java
+++ b/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/SimpleConfiguratorImpl.java
@@ -17,6 +17,7 @@ import java.net.URL;
import java.util.List;
import org.eclipse.equinox.internal.provisional.configurator.Configurator;
import org.eclipse.equinox.internal.simpleconfigurator.utils.*;
+import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
/**
@@ -33,14 +34,16 @@ import org.osgi.framework.BundleContext;
*/
public class SimpleConfiguratorImpl implements Configurator {
- BundleContext context;
+ private static URL configurationURL = null;
+ private static Object configurationLock = new Object();
- ConfigApplier configApplier;
+ private BundleContext context;
+ private ConfigApplier configApplier;
+ private Bundle bundle;
- private URL url = null;
-
- SimpleConfiguratorImpl(BundleContext context) {
+ public SimpleConfiguratorImpl(BundleContext context, Bundle bundle) {
this.context = context;
+ this.bundle = bundle;
}
private URL getConfigurationURL() {
@@ -94,21 +97,23 @@ public class SimpleConfiguratorImpl implements Configurator {
return null;
}
- public synchronized void applyConfiguration(URL url) throws IOException {
- if (Activator.DEBUG)
- System.out.println("applyConfiguration() URL=" + url);
- if (url == null)
- return;
- this.url = url;
-
- List bundleInfoList = SimpleConfiguratorUtils.readConfiguration(url);
- if (Activator.DEBUG)
- System.out.println("applyConfiguration() bundleInfoList.size()=" + bundleInfoList.size());
- if (bundleInfoList.size() == 0)
- return;
- if (this.configApplier == null)
- configApplier = new ConfigApplier(context, this);
- configApplier.install(Utils.getBundleInfosFromList(bundleInfoList), url, isExclusiveInstallation());
+ public void applyConfiguration(URL url) throws IOException {
+ synchronized (configurationLock) {
+ if (Activator.DEBUG)
+ System.out.println("applyConfiguration() URL=" + url);
+ if (url == null)
+ return;
+ configurationURL = url;
+
+ List bundleInfoList = SimpleConfiguratorUtils.readConfiguration(url);
+ if (Activator.DEBUG)
+ System.out.println("applyConfiguration() bundleInfoList.size()=" + bundleInfoList.size());
+ if (bundleInfoList.size() == 0)
+ return;
+ if (this.configApplier == null)
+ configApplier = new ConfigApplier(context, bundle);
+ configApplier.install(Utils.getBundleInfosFromList(bundleInfoList), url, isExclusiveInstallation());
+ }
}
private boolean isExclusiveInstallation() {
@@ -118,14 +123,18 @@ public class SimpleConfiguratorImpl implements Configurator {
return Boolean.valueOf(value).booleanValue();
}
- public synchronized void applyConfiguration() throws IOException {
- if (url == null)
- url = getConfigurationURL();
+ public void applyConfiguration() throws IOException {
+ synchronized (configurationLock) {
+ if (configurationURL == null)
+ configurationURL = getConfigurationURL();
- applyConfiguration(url);
+ applyConfiguration(configurationURL);
+ }
}
- public synchronized URL getUrlInUse() {
- return url;
+ public URL getUrlInUse() {
+ synchronized (configurationLock) {
+ return configurationURL;
+ }
}
}

Back to the top