/******************************************************************************* * Copyright (c) 2000, 2006 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.update.internal.core; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import org.eclipse.core.runtime.*; import org.eclipse.update.core.*; /** * Feature and corresponding patch features */ public class PatchedFeature { private IFeatureReference feature; private Collection patches = new HashSet(); /** * */ public PatchedFeature(IFeatureReference feature) { super(); this.feature = feature; } public void addPatch(IFeatureReference patch) { patches.add(patch); } /** * @return Returns the feature. */ public IFeatureReference getFeature() { return feature; } /** * @return Returns the patches. */ public IFeatureReference[] getPatches() { return (IFeatureReference[]) patches.toArray(new IFeatureReference[patches.size()]); } /** * @return Returns the feature and the patches. */ public IFeatureReference[] getFeatureAndPatches() { IFeatureReference[] features = new IFeatureReference[patches.size() + 1]; features[0] = feature; System.arraycopy(getPatches(), 0, features, 1, patches.size()); return features; } /** * Obtains all plugins from the feature and its patches. Each plugin will * have unique ID. * If there are multiple version of plugin with same ID among the feature * and its patches, highest version plugins are chosen. * * @return FeaturePlugin[] */ public FeaturePlugin[] getPlugins() { // Use a map of PatchedPluigns by plugin ID // to collect one version of each plugin Map plugins = new HashMap(); IFeatureReference[] featureRefs = getFeatureAndPatches(); // for each (feature or any patch) for (int i = 0; i < featureRefs.length; i++) { try { IFeature feature = featureRefs[i].getFeature(null); if (feature == null) { UpdateCore.warn("Null Feature", new Exception()); //$NON-NLS-1$ continue; } // get plugin entries IPluginEntry[] entries = feature.getPluginEntries(); for (int entr = 0; entr < entries.length; entr++) { String pluginId = entries[entr].getVersionedIdentifier().getIdentifier(); PluginVersionIdentifier pluginVersion = entries[entr].getVersionedIdentifier().getVersion(); // check if map contains >= version of same plugin FeaturePlugin existingPlugin = (FeaturePlugin) plugins.get(pluginId); if (existingPlugin != null && existingPlugin.getEntry().getVersionedIdentifier().getVersion().isGreaterOrEqualTo(pluginVersion)) { // same or newer plugin already collected continue; } else { plugins.put(pluginId, new FeaturePlugin(entries[entr], feature)); } } } catch (CoreException e) { UpdateCore.warn(null, e); } } return (FeaturePlugin[]) plugins.values().toArray(new FeaturePlugin[plugins.size()]); } public String toString() { StringBuffer str = new StringBuffer(feature.toString()); IFeatureReference[] patches = getFeatureAndPatches(); for (int i = 0; i < patches.length; i++) { str.append(" +patch=" + patches[i].toString() + " "); //$NON-NLS-1$ //$NON-NLS-2$ } return str.toString(); } }