diff options
author | Simon Kaegi | 2008-03-04 21:01:30 +0000 |
---|---|---|
committer | Simon Kaegi | 2008-03-04 21:01:30 +0000 |
commit | 546fcf8b812668b562825189da020d95b5a6c48d (patch) | |
tree | ecf9673a934782b4265471aa9797802afeefef90 /bundles/org.eclipse.equinox.simpleconfigurator | |
parent | 795d1d536b9126e2ebf829a1c67f1b2efe5f3783 (diff) | |
download | rt.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')
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; + } } } |