blob: bc9dae9cca8da14c63925cf6bea22d34a744b473 [file] [log] [blame]
/*******************************************************************************
* 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();
}
}