diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IConfiguration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IConfiguration.java
index 598bba51fba..170d3ba1274 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IConfiguration.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IConfiguration.java
@@ -224,17 +224,17 @@ public interface IConfiguration extends IBuildObject {
/**
* Returns the ITool
in this configuration's tool-chain with
- * the specified ID, or a tool with a superclass with this id.
+ * the specified ID, or the tool(s) with a superclass with this id.
*
*
If the tool-chain does not have a tool with that ID, the method
- * returns null
. It is the responsibility of the caller to
+ * returns an empty array. It is the responsibility of the caller to
* verify the return value.
*
* @param id unique identifier of the tool to search for
- * @return ITool
+ * @return ITool[]
* @since 3.0.2
*/
- public ITool getToolBySuperClassId(String id);
+ public ITool[] getToolsBySuperClassId(String id);
/**
* Returns the IToolChain
child of this configuration.
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IProjectType.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IProjectType.java
index 77a4bb579c6..e52ef3a3901 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IProjectType.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IProjectType.java
@@ -47,6 +47,7 @@ public interface IProjectType extends IBuildObject {
public static final String IS_ABSTRACT = "isAbstract"; //$NON-NLS-1$
public static final String UNUSED_CHILDREN = "unusedChildren"; //$NON-NLS-1$
public static final String IS_TEST = "isTest"; //$NON-NLS-1$
+ public static final String CONVERT_TO_ID = "convertToId"; //$NON-NLS-1$
public static final String CONFIGURATION_NAME_PROVIDER = "configurationNameProvider"; //$NON-NLS-1$
public static final String PROJECT_ENVIRONMENT_SUPPLIER = "projectEnvironmentSupplier"; //$NON-NLS-1$
public static final String PROJECT_MACRO_SUPPLIER = "projectMacroSupplier"; //$NON-NLS-1$
@@ -164,4 +165,26 @@ public interface IProjectType extends IBuildObject {
* @return IProjectBuildMacroSupplier
*/
public IProjectBuildMacroSupplier getBuildMacroSupplier();
+
+ /**
+ * Returns the 'convertToId' of this project type.
+ *
+ * @return String
+ */
+
+ public String getConvertToId();
+
+ /**
+ * Sets the 'convertToId' attribute of the project type.
+ *
+ * @param convertToId
+ */
+ public void setConvertToId(String convertToId);
+
+ /**
+ * check for migration support.
+ * @return boolean
+ */
+
+ public boolean checkForMigrationSupport();
}
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IToolChain.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IToolChain.java
index 70158fc58ab..efe04cae754 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IToolChain.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IToolChain.java
@@ -163,17 +163,17 @@ public interface IToolChain extends IBuildObject, IHoldsOptions {
/**
* Returns the ITool
in the tool-chain with the specified
- * ID, or a tool with a superclass with this id.
+ * ID, or the tool(s) with a superclass with this id.
*
*
If the tool-chain does not have a tool with that ID, the method
- * returns null
. It is the responsibility of the caller to
+ * returns an empty array. It is the responsibility of the caller to
* verify the return value.
*
* @param id unique identifier of the tool to search for
- * @return ITool
+ * @return ITool[]
* @since 3.0.2
*/
- public ITool getToolBySuperClassId(String id);
+ public ITool[] getToolsBySuperClassId(String id);
/**
* Returns the IToolChain
that is the superclass of this
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java
index cb9a9e0238e..bf955448608 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java
@@ -141,7 +141,7 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
private static Map depCalculatorsMap;
private static boolean projectTypesLoaded = false;
// Project types defined in the manifest files
- private static Map projectTypeMap;
+ public static SortedMap projectTypeMap;
private static List projectTypes;
// Configurations defined in the manifest files
private static Map extensionConfigurationMap;
@@ -279,9 +279,9 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
*
* @return Map
*/
- protected static Map getExtensionProjectTypeMap() {
+ public static SortedMap getExtensionProjectTypeMap() {
if (projectTypeMap == null) {
- projectTypeMap = new HashMap();
+ projectTypeMap = new TreeMap();
}
return projectTypeMap;
}
@@ -2668,88 +2668,121 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
// Get the managed project from buildInfo
IManagedProject managedProject = buildInfo.getManagedProject();
+
+ IProjectType projectType = managedProject.getProjectType();
+ if (forCurrentMbsVersion) {
+ element = ((ProjectType) projectType)
+ .getCurrentMbsVersionConversionElement();
+ } else {
+ element = ((ProjectType) projectType)
+ .getPreviousMbsVersionConversionElement();
+ }
- // walk through the hierarchy of the project and
- // call the converters if available for each configuration
- IConfiguration[] configs = managedProject.getConfigurations();
- for (int i = 0; i < configs.length; i++) {
- IConfiguration configuration = configs[i];
- IToolChain toolChain = configuration.getToolChain();
+ if (element != null) {
+ // If there is a converter element for projectType, invoke it.
+ // projectType converter should take care of invoking converters of
+ // it's children
+
+ if (invokeConverter(managedProject, element) == null) {
+ buildInfo.getManagedProject().setValid(false);
+ return false;
+ }
+ } else {
+ // other wise, walk through the hierarchy of the project and
+ // call the converters if available for each configuration
+ IConfiguration[] configs = managedProject.getConfigurations();
+ for (int i = 0; i < configs.length; i++) {
+ IConfiguration configuration = configs[i];
+ IToolChain toolChain = configuration.getToolChain();
- if (forCurrentMbsVersion) {
- element = ((ToolChain)toolChain).getCurrentMbsVersionConversionElement();
- } else {
- element = ((ToolChain)toolChain).getPreviousMbsVersionConversionElement();
- }
-
- if (element != null) {
- // If there is a converter element for toolChain, invoke it
- // toolChain converter should take care of invoking converters of it's children
- if ( invokeConverter(toolChain, element) == null ) {
- buildInfo.getManagedProject().setValid(false);
- return false;
+ if (forCurrentMbsVersion) {
+ element = ((ToolChain) toolChain)
+ .getCurrentMbsVersionConversionElement();
+ } else {
+ element = ((ToolChain) toolChain)
+ .getPreviousMbsVersionConversionElement();
}
- } else {
- // If there are no converters for toolChain, walk through it's children
- ITool[] tools = toolChain.getTools();
- for (int j = 0; j < tools.length; j++) {
- ITool tool = tools[j];
- if (forCurrentMbsVersion) {
- element = ((Tool)tool).getCurrentMbsVersionConversionElement();
- } else {
- element = ((Tool)tool).getPreviousMbsVersionConversionElement();
+
+ if (element != null) {
+ // If there is a converter element for toolChain, invoke it
+ // toolChain converter should take care of invoking
+ // converters of it's children
+ if (invokeConverter(toolChain, element) == null) {
+ buildInfo.getManagedProject().setValid(false);
+ return false;
}
- if (element != null) {
- if ( invokeConverter(tool, element) == null ) {
- buildInfo.getManagedProject().setValid(false);
- return false;
- }
- }
- }
- IBuilder builder = toolChain.getBuilder();
- if (builder != null) {
- if (forCurrentMbsVersion) {
- element = ((Builder)builder).getCurrentMbsVersionConversionElement();
- } else {
- element = ((Builder)builder).getPreviousMbsVersionConversionElement();
- }
-
- if (element != null) {
- if ( invokeConverter(builder, element) == null ) {
- buildInfo.getManagedProject().setValid(false);
- return false;
- }
- }
- }
- }
-
- // walk through each resource configuration and look if there are any converters
- // available. If so, invoke them.
- IResourceConfiguration [] resourceConfigs = configuration.getResourceConfigurations();
- if ( ( resourceConfigs != null) && ( resourceConfigs.length > 0)) {
- for (int j = 0; j < resourceConfigs.length; j++) {
- IResourceConfiguration resConfig = resourceConfigs[j];
- ITool [] resTools = resConfig.getTools();
- for (int k = 0; k < resTools.length; k++) {
- ITool resTool = resTools[k];
+ } else {
+ // If there are no converters for toolChain, walk through
+ // it's children
+ ITool[] tools = toolChain.getTools();
+ for (int j = 0; j < tools.length; j++) {
+ ITool tool = tools[j];
if (forCurrentMbsVersion) {
- element = ((Tool)resTool).getCurrentMbsVersionConversionElement();
+ element = ((Tool) tool)
+ .getCurrentMbsVersionConversionElement();
} else {
- element = ((Tool)resTool).getPreviousMbsVersionConversionElement();
+ element = ((Tool) tool)
+ .getPreviousMbsVersionConversionElement();
}
if (element != null) {
- if ( invokeConverter(resTool, element) == null ) {
+ if (invokeConverter(tool, element) == null) {
+ buildInfo.getManagedProject().setValid(false);
+ return false;
+ }
+ }
+ }
+ IBuilder builder = toolChain.getBuilder();
+ if (builder != null) {
+ if (forCurrentMbsVersion) {
+ element = ((Builder) builder)
+ .getCurrentMbsVersionConversionElement();
+ } else {
+ element = ((Builder) builder)
+ .getPreviousMbsVersionConversionElement();
+ }
+
+ if (element != null) {
+ if (invokeConverter(builder, element) == null) {
buildInfo.getManagedProject().setValid(false);
return false;
}
}
}
}
- } // end of if
- }
-
+
+ // walk through each resource configuration and look if there
+ // are any converters
+ // available. If so, invoke them.
+ IResourceConfiguration[] resourceConfigs = configuration
+ .getResourceConfigurations();
+ if ((resourceConfigs != null) && (resourceConfigs.length > 0)) {
+ for (int j = 0; j < resourceConfigs.length; j++) {
+ IResourceConfiguration resConfig = resourceConfigs[j];
+ ITool[] resTools = resConfig.getTools();
+ for (int k = 0; k < resTools.length; k++) {
+ ITool resTool = resTools[k];
+ if (forCurrentMbsVersion) {
+ element = ((Tool) resTool)
+ .getCurrentMbsVersionConversionElement();
+ } else {
+ element = ((Tool) resTool)
+ .getPreviousMbsVersionConversionElement();
+ }
+ if (element != null) {
+ if (invokeConverter(resTool, element) == null) {
+ buildInfo.getManagedProject().setValid(
+ false);
+ return false;
+ }
+ }
+ }
+ }
+ } // end of if
+ }
+ }
// If control comes here, it means either there is no converter element
// or converters are invoked successfully
+
return true;
}
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java
index 04d73b2555c..0a308e77549 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java
@@ -661,10 +661,10 @@ public class Configuration extends BuildObject implements IConfiguration {
}
/* (non-Javadoc)
- * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#getToolBySuperClassId(java.lang.String)
+ * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#getToolsBySuperClassId(java.lang.String)
*/
- public ITool getToolBySuperClassId(String id) {
- return toolChain.getToolBySuperClassId(id);
+ public ITool[] getToolsBySuperClassId(String id) {
+ return toolChain.getToolsBySuperClassId(id);
}
/* (non-Javadoc)
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedProject.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedProject.java
index 04ee3b464ec..71dd4b539c9 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedProject.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedProject.java
@@ -110,6 +110,13 @@ public class ManagedProject extends BuildObject implements IManagedProject {
// Initialize from the XML attributes
if (loadFromProject(element)) {
+
+ // check for migration support.
+ boolean isSupportAvailable = projectType.checkForMigrationSupport();
+ if (isSupportAvailable == false) {
+ setValid(false);
+ }
+
// Load children
NodeList configElements = element.getChildNodes();
for (int i = 0; i < configElements.getLength(); ++i) {
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OptionCategory.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OptionCategory.java
index bb74a01f80d..31bb20b17f3 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OptionCategory.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OptionCategory.java
@@ -234,7 +234,7 @@ public class OptionCategory extends BuildObject implements IOptionCategory {
if (configuration != null) {
IHoldsOptions optionHolder = getOptionHolder();
if (optionHolder instanceof ITool) {
- optionHolders = configuration.getTools();
+ optionHolders = configuration.getFilteredTools();
} else if (optionHolder instanceof IToolChain) {
// Get the toolchain of this configuration, which is
// the holder equivalent for this option
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ProjectType.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ProjectType.java
index a325734d1ed..9e79c6ef6c1 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ProjectType.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ProjectType.java
@@ -26,12 +26,16 @@ import org.eclipse.cdt.managedbuilder.envvar.IProjectEnvironmentVariableSupplier
import org.eclipse.cdt.managedbuilder.macros.IProjectBuildMacroSupplier;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.PluginVersionIdentifier;
public class ProjectType extends BuildObject implements IProjectType {
private static final String EMPTY_STRING = new String();
- private static final IConfiguration[] emptyConfigs = new IConfiguration[0];
+ //private static final IConfiguration[] emptyConfigs = new IConfiguration[0];
// Superclass
private IProjectType superClass;
@@ -43,6 +47,7 @@ public class ProjectType extends BuildObject implements IProjectType {
private Boolean isAbstract;
private Boolean isTest;
private String unusedChildren;
+ private String convertToId;
private IConfigurationElement configurationNameProviderElement = null;
private IConfigurationNameProvider configurationNameProvider = null;
@@ -54,6 +59,8 @@ public class ProjectType extends BuildObject implements IProjectType {
// Miscellaneous
private boolean resolved = true;
+ private IConfigurationElement previousMbsVersionConversionElement;
+ private IConfigurationElement currentMbsVersionConversionElement;
/*
* C O N S T R U C T O R S
@@ -181,6 +188,8 @@ public class ProjectType extends BuildObject implements IProjectType {
buildMacroSupplierElement = ((DefaultManagedConfigElement)element).getConfigurationElement();
}
+ // Get the 'convertToId' attribute if it is available
+ convertToId = element.getAttribute(CONVERT_TO_ID);
}
/*
@@ -522,4 +531,117 @@ public class ProjectType extends BuildObject implements IProjectType {
}
return null;
}
+
+
+ public String getConvertToId() {
+ if (convertToId == null) {
+ // If I have a superClass, ask it
+ if (getSuperClass() != null) {
+ return getSuperClass().getConvertToId();
+ } else {
+ return EMPTY_STRING;
+ }
+ }
+ return convertToId;
+ }
+
+
+ public void setConvertToId(String convertToId) {
+ if (convertToId == null && this.convertToId == null) return;
+ if (convertToId == null || this.convertToId == null || !convertToId.equals(this.convertToId)) {
+ this.convertToId = convertToId;
+ }
+ return;
+ }
+
+ /*
+ * This function checks for migration support for the projectType while
+ * loading the project. If migration support is needed, looks for the available
+ * converters and adds them to the list.
+ */
+
+ public boolean checkForMigrationSupport() {
+
+ String convertToId = getConvertToId();
+ if ((convertToId == null) || (convertToId.equals(""))) { //$NON-NLS-1$
+ // It means there is no 'convertToId' attribute available and
+ // the project type is still actively
+ // supported by the tool integrator. So do nothing, just return
+ return true;
+ } else {
+ // In case the 'convertToId' attribute is available,
+ // it means that Tool integrator currently does not support this
+ // project type.
+ // Look for the converters available for this project type.
+
+ return getConverter(convertToId);
+ }
+
+ }
+
+ private boolean getConverter(String convertToId) {
+
+ String fromId = null;
+ String toId = null;
+
+ // Get the Converter Extension Point
+ IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
+ .getExtensionPoint("org.eclipse.cdt.managedbuilder.core", //$NON-NLS-1$
+ "projectConverter"); //$NON-NLS-1$
+ if (extensionPoint != null) {
+ // Get the extensions
+ IExtension[] extensions = extensionPoint.getExtensions();
+ for (int i = 0; i < extensions.length; i++) {
+ // Get the configuration elements of each extension
+ IConfigurationElement[] configElements = extensions[i]
+ .getConfigurationElements();
+ for (int j = 0; j < configElements.length; j++) {
+
+ IConfigurationElement element = configElements[j];
+
+ if (element.getName().equals("converter")) { //$NON-NLS-1$
+
+ fromId = element.getAttribute("fromId"); //$NON-NLS-1$
+ toId = element.getAttribute("toId"); //$NON-NLS-1$
+ // Check whether the current converter can be used for
+ // the selected project type
+
+ if (fromId.equals(getId())
+ && toId.equals(convertToId)) {
+ // If it matches
+ String mbsVersion = element
+ .getAttribute("mbsVersion"); //$NON-NLS-1$
+ PluginVersionIdentifier currentMbsVersion = ManagedBuildManager
+ .getBuildInfoVersion();
+
+ // set the converter element based on the MbsVersion
+ if (currentMbsVersion
+ .isGreaterThan(new PluginVersionIdentifier(
+ mbsVersion))) {
+ previousMbsVersionConversionElement = element;
+ } else {
+ currentMbsVersionConversionElement = element;
+ }
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ // If control comes here, it means 'Tool Integrator' specified
+ // 'convertToId' attribute in toolchain definition file, but
+ // has not provided any converter. So, make the project is invalid
+
+ return false;
+ }
+
+
+ public IConfigurationElement getPreviousMbsVersionConversionElement() {
+ return previousMbsVersionConversionElement;
+ }
+
+ public IConfigurationElement getCurrentMbsVersionConversionElement() {
+ return currentMbsVersionConversionElement;
+ }
}
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java
index 5d70a50d1f2..f26f88ea120 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java
@@ -24,7 +24,6 @@ import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IManagedConfigElement;
import org.eclipse.cdt.managedbuilder.core.IManagedIsToolChainSupported;
import org.eclipse.cdt.managedbuilder.core.IManagedProject;
-import org.eclipse.cdt.managedbuilder.core.IOption;
import org.eclipse.cdt.managedbuilder.core.IOutputType;
import org.eclipse.cdt.managedbuilder.core.IProjectType;
import org.eclipse.cdt.managedbuilder.core.ITargetPlatform;
@@ -823,25 +822,26 @@ public class ToolChain extends HoldsOptions implements IToolChain {
}
/* (non-Javadoc)
- * @see org.eclipse.cdt.managedbuilder.core.IToolChain#getToolBySuperClassId(java.lang.String)
+ * @see org.eclipse.cdt.managedbuilder.core.IToolChain#getToolsBySuperClassId(java.lang.String)
*/
- public ITool getToolBySuperClassId(String id) {
- if (id == null) return null;
-
- // Look for a tool with this ID, or a tool with a superclass with this id
- ITool[] tools = getTools();
- for (int i = 0; i < tools.length; i++) {
- ITool targetTool = tools[i];
- ITool tool = targetTool;
- do {
- if (id.equals(tool.getId())) {
- return targetTool;
- }
- tool = tool.getSuperClass();
- } while (tool != null);
+ public ITool[] getToolsBySuperClassId(String id) {
+ List retTools = new ArrayList();
+ if (id != null) {
+ // Look for a tool with this ID, or the tool(s) with a superclass with this id
+ ITool[] tools = getTools();
+ for (int i = 0; i < tools.length; i++) {
+ ITool targetTool = tools[i];
+ ITool tool = targetTool;
+ do {
+ if (id.equals(tool.getId())) {
+ retTools.add(targetTool);
+ break;
+ }
+ tool = tool.getSuperClass();
+ } while (tool != null);
+ }
}
-
- return null;
+ return (ITool[])retTools.toArray( new ITool[retTools.size()]);
}
/* (non-Javadoc)