### Eclipse Workspace Patch 1.0 #P org.eclipse.update.ui Index: src/org/eclipse/update/internal/ui/wizards/ReviewPage.java =================================================================== RCS file: /home/eclipse/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/ReviewPage.java,v retrieving revision 1.79 diff -u -r1.79 ReviewPage.java --- src/org/eclipse/update/internal/ui/wizards/ReviewPage.java 27 Apr 2006 17:11:10 -0000 1.79 +++ src/org/eclipse/update/internal/ui/wizards/ReviewPage.java 4 May 2006 07:20:19 -0000 @@ -13,11 +13,11 @@ import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.Map; +import java.util.List; import java.util.Set; import org.eclipse.core.runtime.CoreException; @@ -64,6 +64,8 @@ import org.eclipse.update.core.IFeature; import org.eclipse.update.core.IFeatureReference; import org.eclipse.update.core.IImport; +import org.eclipse.update.core.IIncludedFeatureReference; +import org.eclipse.update.core.IPluginEntry; import org.eclipse.update.core.ISiteFeatureReference; import org.eclipse.update.core.IURLEntry; import org.eclipse.update.core.Utilities; @@ -1113,7 +1115,7 @@ setValidationStatus(requiredFeaturesResult.getStatus()); Set requiredFeatures = requiredFeaturesResult.getRequiredFeatures(); problematicFeatures.clear(); - + Iterator requiredFeaturesIterator = requiredFeatures.iterator(); ArrayList toBeInstalled = new ArrayList(); @@ -1161,7 +1163,8 @@ if (!toBeInstalled.isEmpty()) { Iterator toBeInstalledIterator = toBeInstalled.iterator(); while (toBeInstalledIterator.hasNext()) { - treeViewer.setChecked(toBeInstalledIterator.next(), true); + IInstallFeatureOperation current = (IInstallFeatureOperation)toBeInstalledIterator.next(); + treeViewer.setChecked(current, true); } return selectRequiredFeatures(); } else { @@ -1274,7 +1277,7 @@ * Update status in the wizard status area */ private void updateWizardMessage() { - if (true) return; + if (validationStatus == null) { lastDisplayedStatus=null; setErrorMessage(null); @@ -1448,44 +1451,143 @@ } } - public boolean isFeatureGood(IImport requiredFeature, - IInstallFeatureOperation feature) { + + public boolean isFeatureGood(IImport requiredFeature, IFeature feature) { + return isFeatureGood(requiredFeature, feature, new ArrayList()); + } + + public boolean isFeatureGood(IImport requiredFeature, IFeature feature, List visitedFeatures) { + + if (requiredFeature.getKind() == IImport.KIND_FEATURE) { + if ((!requiredFeature.getVersionedIdentifier().getIdentifier().equals( + feature.getVersionedIdentifier().getIdentifier()))) { + IIncludedFeatureReference[] iifr = null; + try { + iifr = feature.getIncludedFeatureReferences(); + } catch (CoreException e) { + e.printStackTrace(); + // if we can not get included features then they can not satisfy requirement, so just ignore them + return false; + } + if (iifr == null) { + return false; + } + + for(int i = 0; i < iifr.length; i++) { + IFeature current; + try { + current = iifr[i].getFeature(new NullProgressMonitor()); + } catch (CoreException e) { + // if we can not get feature then it can not satisfy requirement, so just ignore it + e.printStackTrace(); + continue; + } + if (!visitedFeatures.contains(current)) { + visitedFeatures.add(current); + if (isFeatureGood(requiredFeature, current, visitedFeatures)) { + return true; + } + } + } + + return false; + } + + int rule = (requiredFeature.getRule() != IImport.RULE_NONE) ? requiredFeature.getRule() : IImport.RULE_COMPATIBLE; + + switch (rule) { + case IImport.RULE_PERFECT: return feature.getVersionedIdentifier().getVersion().isPerfect( + requiredFeature.getVersionedIdentifier() + .getVersion()); + case IImport.RULE_EQUIVALENT: + return feature.getVersionedIdentifier().getVersion() + .isEquivalentTo( + requiredFeature.getVersionedIdentifier() + .getVersion()); + case IImport.RULE_COMPATIBLE: + return feature.getVersionedIdentifier().getVersion() + .isCompatibleWith( + requiredFeature.getVersionedIdentifier() + .getVersion()); + case IImport.RULE_GREATER_OR_EQUAL: + return feature.getVersionedIdentifier().getVersion() + .isGreaterOrEqualTo( + requiredFeature.getVersionedIdentifier() + .getVersion()); + } - if (!requiredFeature.getVersionedIdentifier().getIdentifier().equals( - feature.getFeature().getVersionedIdentifier().getIdentifier())) { return false; + } else { + if ((requiredFeature.getKind() == IImport.KIND_PLUGIN)) { + return checkIfFeatureHasPlugin( requiredFeature, feature); + } + return false; + } + } + + private boolean checkIfFeatureHasPlugin(IImport requiredFeature, IFeature feature) { + + IPluginEntry[] plugins = feature.getPluginEntries(); + try { + List includedPlugins = getPluginEntriesFromIncludedFeatures(feature, new ArrayList(), new ArrayList()); + includedPlugins.addAll(Arrays.asList(plugins)); + plugins = (IPluginEntry[])includedPlugins.toArray( new IPluginEntry[includedPlugins.size()]); + } catch( CoreException ce) { + // ignore this plugins can not sutisfy requirement anyways + } + if (plugins == null) { + return false; + } + + for(int i = 0; i < plugins.length; i++) { + if (isMatch(plugins[i].getVersionedIdentifier(), requiredFeature.getVersionedIdentifier(), requiredFeature.getIdRule())) { + return true; + } } + + return false; + } - int rule = (requiredFeature.getRule() != IImport.RULE_NONE) ? requiredFeature - .getRule() - : IImport.RULE_COMPATIBLE; + private List getPluginEntriesFromIncludedFeatures(IFeature feature, List plugins, List visitedFeatures) throws CoreException { + IIncludedFeatureReference[] iifr = feature.getIncludedFeatureReferences(); + for(int i = 0; i < iifr.length; i++) { + IFeature current = iifr[i].getFeature(new NullProgressMonitor()); + if (!visitedFeatures.contains(current)) { + IPluginEntry[] pluginEntries = current.getPluginEntries(); + plugins.addAll(Arrays.asList(pluginEntries)); + visitedFeatures.add(current); + getPluginEntriesFromIncludedFeatures(current, plugins, visitedFeatures); + } + } + + return plugins; + } + // vid1 = feature + // vid2 = requiredFeature + private boolean isMatch( VersionedIdentifier vid1, VersionedIdentifier vid2, int rule) { + + if (!vid1.getIdentifier().equals(vid2.getIdentifier())) { + return false; + } + if ( vid2.getVersion().getMajorComponent() == 0 && vid2.getVersion().getMinorComponent() == 0 && vid2.getVersion().getServiceComponent() == 0 ) { + //version is ignored + return true; + } switch (rule) { case IImport.RULE_PERFECT: - return feature.getFeature().getVersionedIdentifier().getVersion() - .isPerfect( - requiredFeature.getVersionedIdentifier() - .getVersion()); + return vid2.getVersion().isPerfect(vid1.getVersion()); case IImport.RULE_EQUIVALENT: - return feature.getFeature().getVersionedIdentifier().getVersion() - .isEquivalentTo( - requiredFeature.getVersionedIdentifier() - .getVersion()); + return vid2.getVersion().isEquivalentTo(vid1.getVersion()); case IImport.RULE_COMPATIBLE: - return feature.getFeature().getVersionedIdentifier().getVersion() - .isCompatibleWith( - requiredFeature.getVersionedIdentifier() - .getVersion()); + return vid2.getVersion().isCompatibleWith(vid1.getVersion()); case IImport.RULE_GREATER_OR_EQUAL: - return feature.getFeature().getVersionedIdentifier().getVersion() - .isGreaterOrEqualTo( - requiredFeature.getVersionedIdentifier() - .getVersion()); + return vid2.getVersion().isGreaterOrEqualTo(vid1.getVersion()); } - return false; } + public boolean isFeatureBetter(IInstallFeatureOperation feature, IInstallFeatureOperation currentFeatureSelected) { @@ -1502,9 +1604,8 @@ IImport requiredFeature, IInstallFeatureOperation feature, IInstallFeatureOperation currentFeatureSelected) { - if (isFeatureGood(requiredFeature, feature) - && isFeatureBetter(feature, currentFeatureSelected)) { - return feature; + if (isFeatureGood(requiredFeature, feature.getFeature()) && isFeatureBetter(feature, currentFeatureSelected)) { + return feature; } else { return currentFeatureSelected; } #P org.eclipse.update.core Index: src/org/eclipse/update/internal/core/UpdateManagerUtils.java =================================================================== RCS file: /home/eclipse/org.eclipse.update.core/src/org/eclipse/update/internal/core/UpdateManagerUtils.java,v retrieving revision 1.131 diff -u -r1.131 UpdateManagerUtils.java --- src/org/eclipse/update/internal/core/UpdateManagerUtils.java 26 Apr 2006 17:49:38 -0000 1.131 +++ src/org/eclipse/update/internal/core/UpdateManagerUtils.java 4 May 2006 07:20:21 -0000 @@ -621,7 +621,7 @@ */ public static int getMatchingRule(String rule) { if (rule == null) - return IImport.RULE_PERFECT; + return IImport.RULE_COMPATIBLE; int ruleInt = ((Integer) table.get(rule)).intValue(); if (ruleInt == IImport.RULE_NONE) return IImport.RULE_PERFECT; @@ -635,6 +635,9 @@ * @since 2.0.2 */ public static int getMatchingIdRule(String rule) { + + if (rule == null) + return IImport.RULE_COMPATIBLE; if (rule!=null && rule.equalsIgnoreCase("prefix")) //$NON-NLS-1$ return IImport.RULE_PREFIX; return IImport.RULE_PERFECT; Index: src/org/eclipse/update/internal/operations/InstallOperation.java =================================================================== RCS file: /home/eclipse/org.eclipse.update.core/src/org/eclipse/update/internal/operations/InstallOperation.java,v retrieving revision 1.16 diff -u -r1.16 InstallOperation.java --- src/org/eclipse/update/internal/operations/InstallOperation.java 11 Apr 2006 15:47:10 -0000 1.16 +++ src/org/eclipse/update/internal/operations/InstallOperation.java 4 May 2006 07:20:21 -0000 @@ -26,6 +26,26 @@ public class InstallOperation extends FeatureOperation implements IInstallFeatureOperation { + + public boolean equals(Object arg) { + if (arg == null) { + return false; + } + + if (!(arg instanceof InstallOperation)) { + return false; + } + + InstallOperation io = (InstallOperation)arg; + + return io.getFeature().getVersionedIdentifier().equals(this.getFeature().getVersionedIdentifier()); + } + + public int hashCode() { + // TODO Auto-generated method stub + return super.getFeature().hashCode(); + } + private IFeatureReference[] optionalFeatures; private IFeature[] unconfiguredOptionalFeatures; private IVerificationListener verifier;