/******************************************************************************* * Copyright (c) 2012, 2016 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.osgi.container; import java.util.ArrayList; import java.util.List; import org.osgi.framework.Bundle; import org.osgi.framework.wiring.BundleRevision; import org.osgi.framework.wiring.BundleRevisions; /** * An implementation of {@link BundleRevisions} which represent a * {@link Module} installed in a {@link ModuleContainer container}. * The ModuleRevisions provides a bridge between the revisions, the * module and the container they are associated with. The * ModuleRevisions holds the information about the installation of * a module in a container such as the module id and location. * @since 3.10 */ public final class ModuleRevisions implements BundleRevisions { private final Object monitor = new Object(); private final Module module; private final ModuleContainer container; /* @GuardedBy("monitor") */ private final List revisions = new ArrayList<>(1); /* @GuardedBy("monitor") */ private boolean uninstalled = false; /* @GuardedBy("monitor") */ private ModuleRevision uninstalledCurrent; ModuleRevisions(Module module, ModuleContainer container) { this.module = module; this.container = container; } public Module getModule() { return module; } ModuleContainer getContainer() { return container; } @Override public Bundle getBundle() { return module.getBundle(); } @Override public List getRevisions() { synchronized (monitor) { return new ArrayList(revisions); } } /** * Same as {@link ModuleRevisions#getRevisions()} except it * returns a list of {@link ModuleRevision}. * @return the list of module revisions */ public List getModuleRevisions() { synchronized (monitor) { return new ArrayList<>(revisions); } } /** * Returns the current {@link ModuleRevision revision} associated with this revisions. * * @return the current {@link ModuleRevision revision} associated with this revisions * or {@code null} if the current revision does not exist. */ ModuleRevision getCurrentRevision() { synchronized (monitor) { if (uninstalled) { return uninstalledCurrent; } if (revisions.isEmpty()) { return null; } return revisions.get(0); } } ModuleRevision addRevision(ModuleRevision revision) { synchronized (monitor) { revisions.add(0, revision); } return revision; } boolean removeRevision(ModuleRevision revision) { try { synchronized (monitor) { return revisions.remove(revision); } } finally { module.cleanup(revision); } } boolean isUninstalled() { synchronized (monitor) { return uninstalled; } } void uninstall() { synchronized (monitor) { uninstalled = true; // save off the current revision if (revisions.isEmpty()) { throw new IllegalStateException("Revisions is empty on uninstall!"); //$NON-NLS-1$ } uninstalledCurrent = revisions.get(0); } } public String toString() { return "moduleID=" + module.getId(); //$NON-NLS-1$ } }