/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.aries.subsystem.core.internal; import org.apache.aries.subsystem.core.internal.BundleResourceInstaller.BundleConstituent; import org.osgi.framework.Bundle; import org.osgi.framework.BundleException; import org.osgi.framework.wiring.BundleRevision; import org.osgi.resource.Resource; import org.osgi.service.subsystem.SubsystemException; public class BundleResourceUninstaller extends ResourceUninstaller { public BundleResourceUninstaller(Resource resource, BasicSubsystem subsystem) { super(resource, subsystem); } public void uninstall() { removeReference(); // Always remove the bundle as a constituent of the subsystem being // acted upon. The bundle may or may not actually be a constituent. // This covers the case of unscoped subsystems with shared content // where the resource may not be uninstallable. removeConstituent(subsystem, new BundleConstituent(null, (BundleRevision)resource)); if (!isResourceUninstallable()) return; // If the resource is uninstallable, remove it from the "provisioned to" // subsystem in case it was a dependency. The "provisioned to" subsystem // may be the same subsystem as the one being acted upon. This covers // the case where a dependency of the subsystem being acted upon was // provisioned to another subsystem but is not content of the other // subsystem. removeConstituent(provisionTo, new BundleConstituent(null, (BundleRevision)resource)); if (isBundleUninstallable()) uninstallBundle(); } private Bundle getBundle() { return getBundleRevision().getBundle(); } private BundleRevision getBundleRevision() { return (BundleRevision)resource; } private boolean isBundleUninstallable() { return getBundle().getState() != Bundle.UNINSTALLED; } private void uninstallBundle() { ThreadLocalSubsystem.set(provisionTo); try { getBundle().uninstall(); } catch (BundleException e) { throw new SubsystemException(e); } finally { ThreadLocalSubsystem.remove(); } } }