/********************************************************************** * Copyright (c) 2005-2009 ant4eclipse project team. * * 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: * Nils Hartmann, Daniel Kasmeroglu, Gerd Wuetherich **********************************************************************/ package org.ant4eclipse.lib.pde.internal.tools; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.ant4eclipse.lib.core.Assure; import org.ant4eclipse.lib.core.logging.A4ELogging; import org.ant4eclipse.lib.core.util.StopWatch; import org.ant4eclipse.lib.pde.model.featureproject.FeatureManifest; import org.ant4eclipse.lib.pde.tools.PdeBuildHelper; import org.eclipse.osgi.service.resolver.BundleDescription; import org.osgi.framework.Version; /** * <p> * Abstract base implementation for all {@link BundleAndFeatureSet BundleAndFeatureSets}. * </p> * * @author Nils Hartmann (nils@nilshartmann.net) * @author Gerd Wütherich (gerd@gerd-wuetherich.de) */ public abstract class AbstractBundleAndFeatureSet implements BundleAndFeatureSet { /** the list that contains all the bundle descriptions */ private List<BundleDescription> _bundleDescriptionList; /** the list that contains all the feature descriptions */ private List<FeatureDescription> _featureDescriptionList; /** indicates whether or not the platform is initialized */ private boolean _isInitialised = false; /** a description of this BundleAndFeatureSet */ private String _description; /** * <p> * Creates a new instance of type {@link AbstractBundleAndFeatureSet}. * </p> * * @param description * a description of this {@link BundleAndFeatureSet} */ protected AbstractBundleAndFeatureSet(String description) { Assure.nonEmpty("description", description); // set the description this._description = description; // create the bundle description list this._bundleDescriptionList = new LinkedList<BundleDescription>(); // create the feature description list this._featureDescriptionList = new LinkedList<FeatureDescription>(); } /** * <p> * Abstract method. Must be implemented to read bundles and features from an underlying location (e.g. a directory * that contains bundles and features or a workspace that contains bundle projects and feature projects). * </p> */ protected abstract void readBundlesAndFeatures(); /** * {@inheritDoc} */ public final void initialize() { // return if already initialized if (this._isInitialised) { return; } refresh(); // set initialized this._isInitialised = true; } /** * {@inheritDoc} */ public FeatureDescription getFeatureDescription(String featureId, Version version) { Assure.nonEmpty("featureId", featureId); Assure.notNull("version", version); // initialize if necessary initialize(); // iterate over feature list for (FeatureDescription featureDescription : this._featureDescriptionList) { // return if match if (featureDescription.getFeatureManifest().getId().equals(featureId) && PdeBuildHelper.resolveVersion(featureDescription.getFeatureManifest().getVersion(), PdeBuildHelper.getResolvedContextQualifier()).equals(version)) { return featureDescription; } } // no Feature found -> return null return null; } /** * {@inheritDoc} */ public FeatureDescription getFeatureDescription(String featureId) { Assure.nonEmpty("featureId", featureId); // initialize if necessary initialize(); // result FeatureDescription result = null; // iterate over feature descriptions for (FeatureDescription featureDescription : this._featureDescriptionList) { // get the feature manifest FeatureManifest featureManifest = featureDescription.getFeatureManifest(); // if match -> set as result if (featureManifest.getId().equals(featureId)) { if (result == null) { result = featureDescription; } else { // the current feature description has a higher version, so use this one if (result.getFeatureManifest().getVersion().compareTo(featureDescription.getFeatureManifest().getVersion()) < 0) { result = featureDescription; } } } } // return result return result; } /** * {@inheritDoc} */ public BundleDescription getBundleDescription(String bundleid) { Assure.nonEmpty("bundleid", bundleid); // initialize if necessary initialize(); // result BundleDescription result = null; for (BundleDescription bundleDescription : this._bundleDescriptionList) { // if match -> set as result if (bundleDescription.getSymbolicName().equals(bundleid)) { if (result == null) { result = bundleDescription; } else { // the current feature description has a higher version, so use this one if (result.getVersion().compareTo(bundleDescription.getVersion()) < 0) { result = bundleDescription; } } } } // return result return result; } /** * {@inheritDoc} */ public final List<BundleDescription> getAllBundleDescriptions() { // initialize if necessary initialize(); return this._bundleDescriptionList; } /** * {@inheritDoc} */ public final boolean containsBundle(String symbolicName) { Assure.notNull("symbolicName", symbolicName); // initialize if necessary initialize(); Iterator<BundleDescription> iterator = this._bundleDescriptionList.iterator(); while (iterator.hasNext()) { BundleDescription description = iterator.next(); if (symbolicName.equals(description.getSymbolicName()) /* * TODO || "system.bundle".equals(symbolicName) && description.isSystemBundle() */) { return true; } } return false; } /** * <p> * Adds the given {@link BundleDescription} to the {@link BundleAndFeatureSet}. * </p> * * @param bundleDescription * the {@link BundleDescription} to add. */ protected final void addBundleDescription(BundleDescription bundleDescription) { Assure.notNull("bundleDescription", bundleDescription); this._bundleDescriptionList.add(bundleDescription); } /** * <p> * Adds the given {@link FeatureDescription} to the {@link BundleAndFeatureSet}. * </p> * * @param featureDescription * the {@link FeatureDescription} to add */ protected final void addFeaturesDescription(FeatureDescription featureDescription) { Assure.notNull("featureDescription", featureDescription); this._featureDescriptionList.add(featureDescription); } /** * <p> * Refreshes the {@link BundleAndFeatureSet}. * </p> */ public final void refresh() { // debug A4ELogging.info("Trying to read bundles and feature from '%s'.", this._description); // create stop watch for debugging purpose StopWatch stopWatch = new StopWatch(this.getClass().getName() + "#refresh"); // refresh stopWatch.start(); // clear list of bundles... this._bundleDescriptionList.clear(); // clear list of features... this._bundleDescriptionList.clear(); // read all bundles and features... readBundlesAndFeatures(); this._isInitialised = true; stopWatch.stop(); // debug A4ELogging.info("Needed %s ms to read %s bundles and %s features from bundle set.", Long.valueOf(stopWatch.getElapsedTime()), Integer.valueOf(this._bundleDescriptionList.size()), Integer.valueOf(this._featureDescriptionList.size())); } }