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)