17015
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteLocal.java b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteLocal.java
index 3e8c82d..9c519e8 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteLocal.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteLocal.java
@@ -10,6 +10,8 @@
import org.eclipse.core.boot.BootLoader;
import org.eclipse.core.boot.IPlatformConfiguration;
import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.model.PluginDescriptorModel;
+import org.eclipse.core.runtime.model.PluginFragmentModel;
import org.eclipse.update.configuration.*;
import org.eclipse.update.core.*;
import org.eclipse.update.core.model.FeatureReferenceModel;
@@ -25,13 +27,9 @@
private ListenersList listeners = new ListenersList();
private SiteReconciler reconciler;
+ private SiteStatusAnalyzer siteStatusAnalyzer;
private boolean isTransient = false;
- private List /* of IFeature */
- allConfiguredFeatures;
- //
- private static List allRunningPlugins; /*VersionedIdentifier */
-
private static final String UPDATE_STATE_SUFFIX = ".metadata";
/*
@@ -745,56 +743,7 @@
}
return bundle;
}
-
- /**
- * compare two feature references
- * returns 0 if the feature are different
- * returns 1 if the version of feature 1 is greater than version of feature 2
- * returns 2 if opposite
- */
- private int compare(IFeatureReference featureRef1, IFeatureReference featureRef2) throws CoreException {
- if (featureRef1 == null)
- return 0;
-
- IFeature feature1 = null;
- IFeature feature2 = null;
- try {
- feature1 = featureRef1.getFeature();
- feature2 = featureRef2.getFeature();
- } catch (CoreException e) {
- UpdateManagerPlugin.warn(null, e);
- return 0;
- }
-
- if (feature1 == null || feature2 == null) {
- return 0;
- }
-
- VersionedIdentifier id1 = feature1.getVersionedIdentifier();
- VersionedIdentifier id2 = feature2.getVersionedIdentifier();
-
- if (id1 == null || id2 == null) {
- return 0;
- }
-
- if (id1.getIdentifier() != null && id1.getIdentifier().equals(id2.getIdentifier())) {
- PluginVersionIdentifier version1 = id1.getVersion();
- PluginVersionIdentifier version2 = id2.getVersion();
- if (version1 != null) {
- boolean greaterOrEqual = (version1.isGreaterOrEqualTo(version2));
- if (greaterOrEqual) {
- return 1;
- } else {
- return 2;
- }
- } else {
- return 2;
- }
- }
- return 0;
- }
-
- /*
+/*
* Compares two URL for equality
* Return false if one of them is null
*/
@@ -803,7 +752,7 @@
return false;
if (url1.equals(url2))
return true;
-
+
// check if URL are file: URL as we may
// have 2 URL pointing to the same featureReference
// but with different representation
@@ -812,65 +761,24 @@
return false;
if (!"file".equalsIgnoreCase(url2.getProtocol()))
return false;
-
+
File file1 = new File(url1.getFile());
File file2 = new File(url2.getFile());
-
+
if (file1 == null)
return false;
-
+
return (file1.equals(file2));
}
+
/*
- * check if the Plugins of the feature are on the plugin path
- * If all the plugins are on the plugin path, and the version match and there is no other version -> HAPPY
- * If all the plugins are on the plugin path, and the version match and there is other version -> AMBIGUOUS
- * If some of the plugins are on the plugin path, but not all -> UNHAPPY
- * Check on all ConfiguredSites
+ *
*/
- private IStatus getStatus(IFeature feature) {
-
- // check if broken first
- IConfiguredSite[] configuredSites = getCurrentConfiguration().getConfiguredSites();
- ISite featureSite = feature.getSite();
- if (featureSite == null) {
- String msg = Policy.bind("SiteLocal.UnableToDetermineFeatureStatusSiteNull",new Object[]{feature.getURL()});
- if (UpdateManagerPlugin.DEBUG && UpdateManagerPlugin.DEBUG_SHOW_CONFIGURATION)
- UpdateManagerPlugin.debug("Cannot determine status of feature:" + feature.getLabel() + ". Site is NULL.");
- return createStatus(IStatus.ERROR,IFeature.STATUS_AMBIGUOUS,msg,null);
- }
-
- ConfiguredSite cSite = null;
- for (int i = 0; i < configuredSites.length && cSite==null; i++) {
- if (featureSite.equals(configuredSites[i].getSite())) {
- cSite = (ConfiguredSite)configuredSites[i];
- IStatus status = cSite.getBrokenStatus(feature);
- if (status.getSeverity()!=IStatus.OK) {
- if (UpdateManagerPlugin.DEBUG && UpdateManagerPlugin.DEBUG_SHOW_CONFIGURATION)
- UpdateManagerPlugin.debug("Feature broken:" + feature.getLabel() + ".Site:" + cSite.toString());
- return status;
- }
- }
- }
-
- // if unconfigured, do not check if ambiguous
- if(cSite!=null){
- IFeatureReference ref = cSite.getSite().getFeatureReference(feature);
- if (ref!=null){
- if (!cSite.getConfigurationPolicy().isConfigured(ref)){
- return createStatus(IStatus.OK,IFeature.STATUS_HAPPY,"",null);
- } else {
- UpdateManagerPlugin.warn("Unable to find reference for feature"+feature+" in site "+cSite.getSite());
- }
- }
- } else {
- UpdateManagerPlugin.warn("Unable to find the configured site in which "+feature+" resides.");
- }
-
- // not broken, check against registry [17015]
- IPluginEntry[] featuresEntries = feature.getPluginEntries();
- return status(featuresEntries);
+ private SiteStatusAnalyzer getSiteStatusAnalyzer() {
+ if (siteStatusAnalyzer == null)
+ siteStatusAnalyzer = new SiteStatusAnalyzer(this);
+ return siteStatusAnalyzer;
}
/*
@@ -881,165 +789,6 @@
* Check on all ConfiguredSites
*/
public IStatus getFeatureStatus(IFeature feature) throws CoreException {
-
- IStatus featureStatus = getStatus(feature);
- IFeatureReference[] children = feature.getIncludedFeatureReferences();
- IFeature childFeature = null;
- IStatus childStatus;
-
- String msg = Policy.bind("SiteLocal.FeatureHappy");
- int code = IFeature.STATUS_HAPPY;
- MultiStatus multiTemp = new MultiStatus(featureStatus.getPlugin(),code,msg,null);
- if (featureStatus.getSeverity()==IStatus.ERROR){
- if (featureStatus.isMultiStatus()){
- multiTemp.addAll(featureStatus);
- } else {
- multiTemp.add(featureStatus);
- }
- }
- if (featureStatus.getCode()>code) code = featureStatus.getCode();
-
- for (int i = 0; i < children.length; i++) {
- try {
- childFeature = children[i].getFeature();
- } catch (CoreException e){
- UpdateManagerPlugin.warn("Error retrieving feature:"+children[i],new Exception());
- }
- if (childFeature==null){
- UpdateManagerPlugin.warn("Feature is null for:"+children[i],new Exception());
- // Unable to find children feature, broken
- String msg1 = Policy.bind("SiteLocal.NestedFeatureUnavailable",new Object[]{children[i].getURL()});
- multiTemp.add(createStatus(IStatus.ERROR,IFeature.STATUS_UNHAPPY,msg1,null));
- if (IFeature.STATUS_UNHAPPY>code) code = IFeature.STATUS_UNHAPPY;
- } else {
- childStatus = getFeatureStatus(childFeature);
- // do not add the status, add the children status as getFeatureStatus
- // returns a multiStatus
- if (childStatus.getSeverity()!=IStatus.OK){
- VersionedIdentifier versionID = childFeature.getVersionedIdentifier();
- String featureVer = (versionID==null)?"":versionID.getVersion().toString();
- String msg1 = Policy.bind("SiteLocal.NestedFeatureUnHappy",childFeature.getLabel(),featureVer);
- multiTemp.add(createStatus(IStatus.ERROR,childStatus.getCode(),msg1,null));
- if (childStatus.getCode()>code) code = childStatus.getCode();
- }
- }
- }
-
- if (code==IFeature.STATUS_UNHAPPY)
- msg = Policy.bind("SiteLocal.FeatureUnHappy");
- if (code==IFeature.STATUS_AMBIGUOUS)
- msg = Policy.bind("SiteLocal.FeatureAmbiguous");
- MultiStatus multi = new MultiStatus(featureStatus.getPlugin(),code,msg,null);
- multi.addAll(multiTemp);
- return multi;
+ return getSiteStatusAnalyzer().getFeatureStatus(feature);
}
-
- /*
- * compute the status based on getStatus() rules
- */
- private IStatus status(IPluginEntry[] featurePlugins) {
- VersionedIdentifier featureID;
- VersionedIdentifier compareID;
-
- String happyMSG = Policy.bind("SiteLocal.FeatureHappy");
- String ambiguousMSG = Policy.bind("SiteLocal.FeatureAmbiguous");
- IStatus featureStatus = createStatus(IStatus.OK,IFeature.STATUS_HAPPY,"",null);
- MultiStatus multi = new MultiStatus(featureStatus.getPlugin(),IFeature.STATUS_AMBIGUOUS,ambiguousMSG,null);
-
-
- VersionedIdentifier[] ids = getAllRunningPlugins();
-
- // is Ambigous if we find a plugin from the feature
- // with a different version and not the one we are looking
- for (int i = 0; i < featurePlugins.length; i++) {
- MultiStatus tempmulti = new MultiStatus(featureStatus.getPlugin(),IFeature.STATUS_AMBIGUOUS,ambiguousMSG,null);
- featureID = featurePlugins[i].getVersionedIdentifier();
- boolean found = false;
- for (int k = 0; k < ids.length && !found; k++) {
- compareID = ids[i];
- if (featureID.getIdentifier().equals(compareID.getIdentifier())) {
- if (featureID.getVersion().equals(compareID.getVersion())) {
- found = true;
- UpdateManagerPlugin.warn("Found the plugin plugin on the path:" + compareID.toString());
- } else {
- // there is a plugin with a different version on the path
- IFeature feature = getFeatureForId(compareID);
-
- String msg = null;
- if (feature==null){
- Object[] values = new Object[]{featureID.getIdentifier(),featureID.getVersion()};
- msg = Policy.bind("SiteLocal.TwoVersionSamePlugin1",values);
- } else {
- String label = feature.getLabel();
- String version = feature.getVersionedIdentifier().getVersion().toString();
- Object[] values = new Object[]{featureID.getIdentifier(),featureID.getVersion(),compareID.getVersion(),label,version};
- msg = Policy.bind("SiteLocal.TwoVersionSamePlugin2",values);
- }
-
-
- UpdateManagerPlugin.warn("Found another version of the same plugin on the path:" + compareID.toString());
- tempmulti.add(createStatus(IStatus.ERROR,IFeature.STATUS_AMBIGUOUS,msg,null));
- }
- }
- }
-
- if (!found){
- multi.addAll(tempmulti);
- }
- }
-
- if (!multi.isOK())
- return multi;
-
- // we return happy as we consider the isBroken verification has been done
- return createStatus(IStatus.OK,IFeature.STATUS_HAPPY,happyMSG,null);
- }
- /*
- * creates a Status
- */
- public IStatus createStatus(int statusSeverity, int statusCode, String msg, Exception e){
- String id =
- UpdateManagerPlugin.getPlugin().getDescriptor().getUniqueIdentifier();
-
- StringBuffer completeString = new StringBuffer("");
- if (msg!=null)
- completeString.append(msg);
- if (e!=null){
- completeString.append("\r\n[");
- completeString.append(e.toString());
- completeString.append("]\r\n");
- }
- return new Status(statusSeverity, id, statusCode, completeString.toString(), e);
- }
-
- /*
- * returns all the configured plugins from the registry
- */
- private VersionedIdentifier[] getAllRunningPlugins(){
- if (allRunningPlugins==null){
- allRunningPlugins = new ArrayList();
- IPluginRegistry reg = Platform.getPluginRegistry();
- IPluginDescriptor[] desc = reg.getPluginDescriptors();
- for (int i = 0; i < desc.length; i++) {
- String id = desc[i].getUniqueIdentifier();
- String ver = desc[i].getVersionIdentifier().toString();
- VersionedIdentifier versionID = new VersionedIdentifier(id,ver);
- allRunningPlugins.add(versionID);
- }
- }
-
- VersionedIdentifier[] ids = new VersionedIdentifier[allRunningPlugins.size()];
- if (allRunningPlugins.size()>0){
- allRunningPlugins.toArray(ids);
- }
- return ids;
- }
-
- /*
- * returns the Feature that declares this versionedIdentifier or null if none found
- */
- private Feature getFeatureForId(VersionedIdentifier id){
-
- return null;
- }
}
\ No newline at end of file
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteStatusAnalyzer.java b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteStatusAnalyzer.java
new file mode 100644
index 0000000..0b63d8c
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteStatusAnalyzer.java
@@ -0,0 +1,442 @@
+package org.eclipse.update.internal.core;
+/*
+ * (c) Copyright IBM Corp. 2000, 2002.
+ * All Rights Reserved.
+ */
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.model.PluginDescriptorModel;
+import org.eclipse.core.runtime.model.PluginFragmentModel;
+import org.eclipse.update.configuration.*;
+import org.eclipse.update.configuration.IConfiguredSite;
+import org.eclipse.update.configuration.IInstallConfiguration;
+import org.eclipse.update.core.*;
+
+/**
+ * This class manages the configurations.
+ */
+
+public class SiteStatusAnalyzer {
+
+ //
+ private static List allRunningPlugins; /*VersionedIdentifier */
+ private static List allConfiguredFeatures; /*VersionedIdentifier */
+
+ private SiteLocal siteLocal;
+
+ /**
+ *
+ */
+ public SiteStatusAnalyzer(SiteLocal siteLocal) {
+ this.siteLocal = siteLocal;
+ }
+
+ /**
+ * manages the versionedIdentifier and location of parsed plugins
+ */
+ public class PluginIdentifier {
+ private VersionedIdentifier id;
+ private String label;
+ private boolean isFragment=false;
+
+ public PluginIdentifier(VersionedIdentifier id, String label, boolean fragment) {
+ this.id = id;
+ this.label = label;
+ this.isFragment = fragment;
+ }
+
+ public VersionedIdentifier getVersionedIdentifier() {
+ return id;
+ }
+
+ public boolean isFragment() {
+ return isFragment;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+ }
+ /**
+ * compare two feature references
+ * returns 0 if the feature are different
+ * returns 1 if the version of feature 1 is greater than version of feature 2
+ * returns 2 if opposite
+ */
+ private int compare(IFeatureReference featureRef1, IFeatureReference featureRef2) throws CoreException {
+ if (featureRef1 == null)
+ return 0;
+
+ IFeature feature1 = null;
+ IFeature feature2 = null;
+ try {
+ feature1 = featureRef1.getFeature();
+ feature2 = featureRef2.getFeature();
+ } catch (CoreException e) {
+ UpdateManagerPlugin.warn(null, e);
+ return 0;
+ }
+
+ if (feature1 == null || feature2 == null) {
+ return 0;
+ }
+
+ VersionedIdentifier id1 = feature1.getVersionedIdentifier();
+ VersionedIdentifier id2 = feature2.getVersionedIdentifier();
+
+ if (id1 == null || id2 == null) {
+ return 0;
+ }
+
+ if (id1.getIdentifier() != null && id1.getIdentifier().equals(id2.getIdentifier())) {
+ PluginVersionIdentifier version1 = id1.getVersion();
+ PluginVersionIdentifier version2 = id2.getVersion();
+ if (version1 != null) {
+ boolean greaterOrEqual = (version1.isGreaterOrEqualTo(version2));
+ if (greaterOrEqual) {
+ return 1;
+ } else {
+ return 2;
+ }
+ } else {
+ return 2;
+ }
+ }
+ return 0;
+ }
+
+ /*
+ * Compares two URL for equality
+ * Return false if one of them is null
+ */
+ private boolean sameURL(URL url1, URL url2) {
+ if (url1 == null)
+ return false;
+ if (url1.equals(url2))
+ return true;
+
+ // check if URL are file: URL as we may
+ // have 2 URL pointing to the same featureReference
+ // but with different representation
+ // (i.e. file:/C;/ and file:C:/)
+ if (!"file".equalsIgnoreCase(url1.getProtocol()))
+ return false;
+ if (!"file".equalsIgnoreCase(url2.getProtocol()))
+ return false;
+
+ File file1 = new File(url1.getFile());
+ File file2 = new File(url2.getFile());
+
+ if (file1 == null)
+ return false;
+
+ return (file1.equals(file2));
+ }
+
+ /*
+ * check if the Plugins of the feature are on the plugin path
+ * If all the plugins are on the plugin path, and the version match and there is no other version -> HAPPY
+ * If all the plugins are on the plugin path, and the version match and there is other version -> AMBIGUOUS
+ * If some of the plugins are on the plugin path, but not all -> UNHAPPY
+ * Check on all ConfiguredSites
+ */
+ private IStatus getStatus(IFeature feature) {
+
+ // check if broken first
+ IInstallConfiguration currentConfiguration = siteLocal.getCurrentConfiguration();
+ IConfiguredSite[] configuredSites = currentConfiguration.getConfiguredSites();
+ ISite featureSite = feature.getSite();
+ if (featureSite == null) {
+ String msg = Policy.bind("SiteLocal.UnableToDetermineFeatureStatusSiteNull",new Object[]{feature.getURL()});
+ if (UpdateManagerPlugin.DEBUG && UpdateManagerPlugin.DEBUG_SHOW_CONFIGURATION)
+ UpdateManagerPlugin.debug("Cannot determine status of feature:" + feature.getLabel() + ". Site is NULL.");
+ return createStatus(IStatus.ERROR,IFeature.STATUS_AMBIGUOUS,msg,null);
+ }
+
+ ConfiguredSite cSite = null;
+ for (int i = 0; i < configuredSites.length && cSite==null; i++) {
+ if (featureSite.equals(configuredSites[i].getSite())) {
+ cSite = (ConfiguredSite)configuredSites[i];
+ IStatus status = cSite.getBrokenStatus(feature);
+ if (status.getSeverity()!=IStatus.OK) {
+ if (UpdateManagerPlugin.DEBUG && UpdateManagerPlugin.DEBUG_SHOW_CONFIGURATION)
+ UpdateManagerPlugin.debug("Feature broken:" + feature.getLabel() + ".Site:" + cSite.toString());
+ return status;
+ }
+ }
+ }
+
+ // if unconfigured, do not check if ambiguous
+ if(cSite!=null){
+ IFeatureReference ref = cSite.getSite().getFeatureReference(feature);
+ if (ref!=null){
+ if (!cSite.getConfigurationPolicy().isConfigured(ref)){
+ return createStatus(IStatus.OK,IFeature.STATUS_HAPPY,"",null);
+ } else {
+ UpdateManagerPlugin.warn("Unable to find reference for feature"+feature+" in site "+cSite.getSite());
+ }
+ }
+ } else {
+ UpdateManagerPlugin.warn("Unable to find the configured site in which "+feature+" resides.");
+ }
+
+ // not broken, check against registry [17015]
+ IPluginEntry[] featuresEntries = feature.getPluginEntries();
+ return status(featuresEntries);
+ }
+
+ /*
+ * check if the Plugins of the feature are on the plugin path
+ * If all the plugins are on the plugin path, and the version match and there is no other version -> HAPPY
+ * If all the plugins are on the plugin path, and the version match and there is other version -> AMBIGUOUS
+ * If some of the plugins are on the plugin path, but not all -> UNHAPPY
+ * Check on all ConfiguredSites
+ */
+ public IStatus getFeatureStatus(IFeature feature) throws CoreException {
+
+ IInstallConfiguration currentConfig = siteLocal.getCurrentConfiguration();
+ IStatus featureStatus = getStatus(feature);
+ IFeatureReference[] children = feature.getIncludedFeatureReferences();
+ IFeature childFeature = null;
+ IStatus childStatus;
+
+ String msg = Policy.bind("SiteLocal.FeatureHappy");
+ int code = IFeature.STATUS_HAPPY;
+ MultiStatus multiTemp = new MultiStatus(featureStatus.getPlugin(),code,msg,null);
+ if (featureStatus.getSeverity()==IStatus.ERROR){
+ if (featureStatus.isMultiStatus()){
+ multiTemp.addAll(featureStatus);
+ } else {
+ multiTemp.add(featureStatus);
+ }
+ }
+ if (featureStatus.getCode()>code) code = featureStatus.getCode();
+
+ for (int i = 0; i < children.length; i++) {
+ try {
+ childFeature = children[i].getFeature();
+ } catch (CoreException e){
+ UpdateManagerPlugin.warn("Error retrieving feature:"+children[i],new Exception());
+ }
+ if (childFeature==null){
+ UpdateManagerPlugin.warn("Feature is null for:"+children[i],new Exception());
+ // Unable to find children feature, broken
+ String msg1 = Policy.bind("SiteLocal.NestedFeatureUnavailable",new Object[]{children[i].getURL()});
+ multiTemp.add(createStatus(IStatus.ERROR,IFeature.STATUS_UNHAPPY,msg1,null));
+ if (IFeature.STATUS_UNHAPPY>code) code = IFeature.STATUS_UNHAPPY;
+ } else {
+ childStatus = getFeatureStatus(childFeature);
+ // do not add the status, add the children status as getFeatureStatus
+ // returns a multiStatus
+ if (childStatus.getSeverity()!=IStatus.OK){
+ VersionedIdentifier versionID = childFeature.getVersionedIdentifier();
+ String featureVer = (versionID==null)?"":versionID.getVersion().toString();
+ String msg1 = Policy.bind("SiteLocal.NestedFeatureUnHappy",childFeature.getLabel(),featureVer);
+ multiTemp.add(createStatus(IStatus.ERROR,childStatus.getCode(),msg1,null));
+ if (childStatus.getCode()>code) code = childStatus.getCode();
+ }
+ }
+ }
+
+ if (code==IFeature.STATUS_UNHAPPY)
+ msg = Policy.bind("SiteLocal.FeatureUnHappy");
+ if (code==IFeature.STATUS_AMBIGUOUS)
+ msg = Policy.bind("SiteLocal.FeatureAmbiguous");
+ MultiStatus multi = new MultiStatus(featureStatus.getPlugin(),code,msg,null);
+ multi.addAll(multiTemp);
+ return multi;
+ }
+
+ /*
+ * compute the status based on getStatus() rules
+ */
+ private IStatus status(IPluginEntry[] featurePlugins) {
+ VersionedIdentifier featureID;
+ VersionedIdentifier compareID;
+ String pluginName;
+
+ String happyMSG = Policy.bind("SiteLocal.FeatureHappy");
+ String ambiguousMSG = Policy.bind("SiteLocal.FeatureAmbiguous");
+ IStatus featureStatus = createStatus(IStatus.OK,IFeature.STATUS_HAPPY,"",null);
+ MultiStatus multi = new MultiStatus(featureStatus.getPlugin(),IFeature.STATUS_AMBIGUOUS,ambiguousMSG,null);
+
+
+ PluginIdentifier[] ids = getAllRunningPlugins();
+
+ // is Ambigous if we find a plugin from the feature
+ // with a different version and not the one we are looking
+ for (int i = 0; i < featurePlugins.length; i++) {
+ MultiStatus tempmulti = new MultiStatus(featureStatus.getPlugin(),IFeature.STATUS_AMBIGUOUS,ambiguousMSG,null);
+ featureID = featurePlugins[i].getVersionedIdentifier();
+ boolean found = false;
+ for (int k = 0; k < ids.length && !found; k++) {
+ compareID = ids[k].getVersionedIdentifier();
+ pluginName=null;
+ if (featureID.getIdentifier().equals(compareID.getIdentifier())) {
+ pluginName=ids[k].getLabel();
+ if (featureID.getVersion().isPerfect(compareID.getVersion())) {
+ found = true;
+ UpdateManagerPlugin.warn("Found the plugin plugin on the path:" + compareID.toString());
+ } else {
+ // there is a plugin with a different version on the path
+ // log it
+ IFeature feature = getFeatureForId(compareID);
+
+ String msg = null;
+ if (feature==null){
+ Object[] values = new Object[]{pluginName,featureID.getVersion(),compareID.getVersion()};
+ msg = Policy.bind("SiteLocal.TwoVersionSamePlugin1",values);
+ } else {
+ String label = feature.getLabel();
+ String version = feature.getVersionedIdentifier().getVersion().toString();
+ Object[] values = new Object[]{pluginName,featureID.getVersion(),compareID.getVersion(),label,version};
+ msg = Policy.bind("SiteLocal.TwoVersionSamePlugin2",values);
+ }
+
+ UpdateManagerPlugin.warn("Found another version of the same plugin on the path:" + compareID.toString());
+ tempmulti.add(createStatus(IStatus.ERROR,IFeature.STATUS_AMBIGUOUS,msg,null));
+ }
+ }
+ }
+
+ // if we haven't found the exact plugin, add the children
+ // of tempMulti (i,e the other we found)
+ // if we have no children, we have a problem as a required plugin is not there at all
+ if (!found){
+ if (tempmulti.getChildren().length>0){
+ multi.addAll(tempmulti);
+ } else {
+ if (multi.getCode()!=IFeature.STATUS_UNHAPPY){
+ String unhappyMSG = Policy.bind("SiteLocal.FeatureUnHappy");
+ MultiStatus newMulti = new MultiStatus(featureStatus.getPlugin(),IFeature.STATUS_UNHAPPY,unhappyMSG,null);
+ newMulti.addAll(multi);
+ multi=newMulti;
+ }
+ String msg = Policy.bind("SiteLocal.NoPluginVersion",featureID.getIdentifier());
+ multi.add(createStatus(IStatus.ERROR,IFeature.STATUS_UNHAPPY,msg,null));
+ }
+ }
+ }
+
+ if (!multi.isOK())
+ return multi;
+
+ // we return happy as we consider the isBroken verification has been done
+ return createStatus(IStatus.OK,IFeature.STATUS_HAPPY,happyMSG,null);
+ }
+ /*
+ * creates a Status
+ */
+ public IStatus createStatus(int statusSeverity, int statusCode, String msg, Exception e){
+ String id =
+ UpdateManagerPlugin.getPlugin().getDescriptor().getUniqueIdentifier();
+
+ StringBuffer completeString = new StringBuffer("");
+ if (msg!=null)
+ completeString.append(msg);
+ if (e!=null){
+ completeString.append("\r\n[");
+ completeString.append(e.toString());
+ completeString.append("]\r\n");
+ }
+ return new Status(statusSeverity, id, statusCode, completeString.toString(), e);
+ }
+
+ /*
+ * returns all the configured plugins from the registry
+ */
+ private PluginIdentifier[] getAllRunningPlugins(){
+ if (allRunningPlugins==null){
+ PluginIdentifier pluginIdentifier;
+ allRunningPlugins = new ArrayList();
+ IPluginRegistry reg = Platform.getPluginRegistry();
+ IPluginDescriptor[] desc = reg.getPluginDescriptors();
+ for (int i = 0; i < desc.length; i++) {
+ String id = desc[i].getUniqueIdentifier();
+ String ver = desc[i].getVersionIdentifier().toString();
+ VersionedIdentifier versionID = new VersionedIdentifier(id,ver);
+ pluginIdentifier = new PluginIdentifier(versionID,desc[i].getLabel(),false);
+ allRunningPlugins.add(pluginIdentifier);
+ // check fragments
+ if (desc[i] instanceof PluginDescriptorModel){
+ PluginDescriptorModel descModel = (PluginDescriptorModel)desc[i];
+ PluginFragmentModel[] frags = descModel.getFragments();
+ if (frags!=null){
+ for (int j = 0; j < frags.length; j++) {
+ String fragID = frags[j].getId();
+ String fragVER = frags[j].getVersion();
+ VersionedIdentifier fragVersionID = new VersionedIdentifier(fragID,fragVER);
+ pluginIdentifier = new PluginIdentifier(fragVersionID,frags[j].getName(),true);
+ allRunningPlugins.add(pluginIdentifier);
+ }
+ }
+ }
+ }
+ }
+
+ PluginIdentifier[] ids = new PluginIdentifier[allRunningPlugins.size()];
+ if (allRunningPlugins.size()>0){
+ allRunningPlugins.toArray(ids);
+ }
+ return ids;
+ }
+
+ /*
+ * returns all the configured fetaures
+ */
+ private IFeature[] getAllConfiguredFeatures(){
+ if (allConfiguredFeatures==null){
+
+ allConfiguredFeatures = new ArrayList();
+ IConfiguredSite[] allConfiguredSites = siteLocal.getCurrentConfiguration().getConfiguredSites();
+
+ for (int i = 0; i < allConfiguredSites.length; i++) {
+ IFeatureReference[] refs = allConfiguredSites[i].getConfiguredFeatures();
+ IFeature feature = null;
+ for (int j = 0; j < refs.length; j++) {
+ feature=null;
+ try {
+ feature = refs[j].getFeature();
+ } catch (CoreException e){}
+ if (feature!=null){
+ allConfiguredFeatures.add(feature);
+ }
+ }
+ }
+ }
+
+ IFeature[] features = new IFeature[allConfiguredFeatures.size()];
+ if (allConfiguredFeatures.size()>0){
+ allConfiguredFeatures.toArray(features);
+ }
+ return features;
+ }
+
+ /*
+ * returns the Feature that declares this versionedIdentifier or null if none found
+ */
+ private IFeature getFeatureForId(VersionedIdentifier id){
+
+ if (id==null)
+ return null;
+
+ IFeature[] allFeatures = getAllConfiguredFeatures();
+ IFeature currentFeature=null;
+ IPluginEntry[] allPlugins = null;
+ IPluginEntry currentPlugin = null;
+ for (int i = 0; i < allFeatures.length; i++) {
+ currentFeature = allFeatures[i];
+ allPlugins = currentFeature.getPluginEntries();
+ for (int j = 0; j < allPlugins.length; j++) {
+ currentPlugin = allPlugins[j];
+ if (id.equals(currentPlugin.getVersionedIdentifier()))
+ return currentFeature;
+ }
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/messages.properties b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/messages.properties
index f922533..61d3b0e 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/messages.properties
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/messages.properties
@@ -192,13 +192,14 @@
SiteLocal.UnableToRetrieveRWArea= Internal Error. Unable to retrieve location to write metadata.
SiteLocal.SiteUrlIsNull= Internal Error: URL of local site is null.
SiteLocal.UnableToDetermineFeatureStatusSiteNull=Unable to determine status of feature\"{0}\" The site is NULL.
-SiteLocal.TwoVersionSamePlugin1=Plugin: {0} version: {1} referenced by this feature is not included at runtime.
-SiteLocal.TwoVersionSamePlugin2=Plugin: {0} version: {1} referenced by this feature is not included at runtime.\n Runtime includes plugin version {3} supplied by feature {4} version {5}.
+SiteLocal.TwoVersionSamePlugin1=Plugin: \"{0}\" version: \"{1}\" referenced by this feature is not included at runtime. Runtime includes plugin version \"{2}\".
+SiteLocal.TwoVersionSamePlugin2=Plugin: \"{0}\" version: \"{1}\" referenced by this feature is not included at runtime. Runtime includes plugin version \"{2}\" supplied by feature \"{3}\" version \"{4}\".
SiteLocal.FeatureUnHappy=The feature is not configured properly.
SiteLocal.FeatureHappy=The feature is configured properly.
SiteLocal.FeatureAmbiguous=The feature may not be configured properly.
SiteLocal.NestedFeatureUnHappy=Included feature \"{0}\" version \"{1}\" contains problems.
SiteLocal.NestedFeatureUnavailable=Included feature \"{0}\" is missing.
+SiteLocal.NoPluginVersion=No plugin: \"{0}\" included at runtime.
SiteReconciler.UnableToSaveStateIn= Unable to persist delta change into {0}.
SiteReconciler.UnableToEncodeConfiguration= Unable to encode delta change into {0}.