| /******************************************************************************* |
| * Copyright (c) 2005, 2016 Intel Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Intel Corporation - Initial API and implementation |
| * IBM Corporation |
| *******************************************************************************/ |
| package org.eclipse.cdt.managedbuilder.internal.core; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import org.eclipse.cdt.core.settings.model.ICSettingBase; |
| import org.eclipse.cdt.core.settings.model.ICStorageElement; |
| import org.eclipse.cdt.core.settings.model.extension.CFileData; |
| import org.eclipse.cdt.core.settings.model.extension.CLanguageData; |
| import org.eclipse.cdt.internal.core.SafeStringInterner; |
| import org.eclipse.cdt.managedbuilder.core.IBuildObject; |
| import org.eclipse.cdt.managedbuilder.core.IConfiguration; |
| import org.eclipse.cdt.managedbuilder.core.IFileInfo; |
| import org.eclipse.cdt.managedbuilder.core.IFolderInfo; |
| import org.eclipse.cdt.managedbuilder.core.IManagedConfigElement; |
| import org.eclipse.cdt.managedbuilder.core.IOption; |
| import org.eclipse.cdt.managedbuilder.core.IResourceConfiguration; |
| import org.eclipse.cdt.managedbuilder.core.IResourceInfo; |
| import org.eclipse.cdt.managedbuilder.core.ITool; |
| import org.eclipse.cdt.managedbuilder.core.IToolChain; |
| import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; |
| import org.eclipse.cdt.managedbuilder.internal.dataprovider.BuildFileData; |
| import org.eclipse.cdt.managedbuilder.internal.dataprovider.BuildLanguageData; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| import org.osgi.framework.Version; |
| |
| public class ResourceConfiguration extends ResourceInfo implements IFileInfo { |
| |
| //property name for holding the rebuild state |
| private static final String REBUILD_STATE = "rebuildState"; //$NON-NLS-1$ |
| |
| // Parent and children |
| private List<ITool> toolList; |
| private Map<String, ITool> toolMap; |
| // Managed Build model attributes |
| private Integer rcbsApplicability; |
| private String toolsToInvoke; |
| // Miscellaneous |
| private boolean isExtensionResourceConfig = false; |
| private boolean resolved = true; |
| |
| /* |
| * C O N S T R U C T O R S |
| */ |
| |
| /** |
| * This constructor is called to create a resource configuration defined by an |
| * extension point in a plugin manifest file, or returned by a dynamic element provider |
| * |
| * @param parent The IConfiguration parent of this resource configuration |
| * @param element The resource configuration definition from the manifest file |
| * or a dynamic element provider |
| */ |
| public ResourceConfiguration(IConfiguration parent, IManagedConfigElement element, String managedBuildRevision) { |
| super(parent, element, true); |
| isExtensionResourceConfig = true; |
| |
| // setup for resolving |
| resolved = false; |
| |
| setManagedBuildRevision(managedBuildRevision); |
| loadFromManifest(element); |
| |
| // Hook me up to the Managed Build Manager |
| ManagedBuildManager.addExtensionResourceConfiguration(this); |
| |
| // Load the tool children |
| IManagedConfigElement[] tools = element.getChildren(ITool.TOOL_ELEMENT_NAME); |
| for (int n = 0; n < tools.length; ++n) { |
| Tool toolChild = new Tool(this, tools[n], getManagedBuildRevision()); |
| getToolList().add(toolChild); |
| getToolMap().put(toolChild.getId(), toolChild); |
| } |
| |
| setDirty(false); |
| } |
| |
| /** |
| * Create a <code>ResourceConfiguration</code> based on the specification stored in the |
| * project file (.cdtbuild). |
| * |
| * @param parent The <code>IConfiguration</code> the resource configuration will be added to. |
| * @param element The XML element that contains the resource configuration settings. |
| */ |
| public ResourceConfiguration(IConfiguration parent, ICStorageElement element, String managedBuildRevision) { |
| super(parent, element, true); |
| isExtensionResourceConfig = false; |
| setResourceData(new BuildFileData(this)); |
| |
| setManagedBuildRevision(managedBuildRevision); |
| // Initialize from the XML attributes |
| loadFromProject(element); |
| |
| // Load children |
| ICStorageElement configElements[] = element.getChildren(); |
| for (int i = 0; i < configElements.length; ++i) { |
| ICStorageElement configElement = configElements[i]; |
| if (configElement.getName().equals(ITool.TOOL_ELEMENT_NAME)) { |
| Tool tool = new Tool(this, configElement, getManagedBuildRevision()); |
| addTool(tool); |
| } |
| } |
| |
| String rebuild = PropertyManager.getInstance().getProperty(this, REBUILD_STATE); |
| if (rebuild == null || Boolean.valueOf(rebuild).booleanValue()) |
| setRebuildState(true); |
| setDirty(false); |
| } |
| |
| public ResourceConfiguration(FolderInfo folderInfo, ITool baseTool, String id, String resourceName, IPath path) { |
| super(folderInfo, path, id, resourceName); |
| // setParentFolder(folderInfo); |
| // setParentFolderId(folderInfo.getId()); |
| |
| isExtensionResourceConfig = folderInfo.isExtensionElement(); |
| if (!isExtensionResourceConfig) |
| setResourceData(new BuildFileData(this)); |
| |
| if (folderInfo.getParent() != null) |
| setManagedBuildRevision(folderInfo.getParent().getManagedBuildRevision()); |
| |
| setDirty(false); |
| toolsToInvoke = ""; //$NON-NLS-1$ |
| rcbsApplicability = KIND_DISABLE_RCBS_TOOL; |
| |
| // Get file extension. |
| String extString = path.getFileExtension(); |
| if (baseTool != null) { |
| if (baseTool.getParentResourceInfo() != folderInfo) |
| baseTool = null; |
| } |
| // Add the resource specific tools to this resource. |
| ITool tools[] = folderInfo.getFilteredTools(); |
| String subId = ""; //$NON-NLS-1$ |
| for (int i = 0; i < tools.length; i++) { |
| if (tools[i].buildsFileType(extString)) { |
| baseTool = tools[i]; |
| break; |
| } |
| } |
| |
| if (baseTool != null) { |
| subId = ManagedBuildManager.calculateChildId(baseTool.getId(), null); |
| createTool(baseTool, subId, baseTool.getName(), false); |
| setRebuildState(true); |
| } |
| } |
| |
| /** |
| * Create a new resource configuration based on one already defined. |
| * |
| * @param cfg The <code>IConfiguration</code> the resource configuration will be added to. |
| * @param cloneConfig The <code>ResourceConfiguration</code> to copy the settings from. |
| * @param id A unique ID for the new resource configuration. |
| */ |
| public ResourceConfiguration(IConfiguration cfg, ResourceConfiguration cloneConfig, String id, |
| Map<IPath, Map<String, String>> superClassIdMap, boolean cloneChildren) { |
| super(cfg, cloneConfig, id); |
| |
| isExtensionResourceConfig = cfg.isExtensionElement(); |
| if (!cloneConfig.isExtensionResourceConfig) |
| cloneChildren = true; |
| |
| if (!isExtensionResourceConfig) |
| setResourceData(new BuildFileData(this)); |
| |
| setManagedBuildRevision(cloneConfig.getManagedBuildRevision()); |
| |
| // Copy the remaining attributes |
| if (cloneConfig.toolsToInvoke != null) { |
| toolsToInvoke = cloneConfig.toolsToInvoke; |
| } |
| if (cloneConfig.rcbsApplicability != null) { |
| rcbsApplicability = cloneConfig.rcbsApplicability; |
| } |
| |
| boolean copyIds = cloneChildren && id.equals(cloneConfig.id); |
| // Clone the resource configuration's tool children |
| if (cloneConfig.toolList != null) { |
| for (ITool toolChild : cloneConfig.getToolList()) { |
| String subId = null; |
| String subName; |
| |
| Map<String, String> curIdMap = superClassIdMap.get(cloneConfig.getPath()); |
| ITool extTool = ManagedBuildManager.getExtensionTool(toolChild); |
| if (curIdMap != null) { |
| if (extTool != null) { |
| subId = curIdMap.get(extTool.getId()); |
| } |
| } |
| |
| subName = toolChild.getName(); |
| |
| if (subId == null) { |
| if (extTool != null) { |
| subId = copyIds ? toolChild.getId() |
| : ManagedBuildManager.calculateChildId(extTool.getId(), null); |
| // subName = toolChild.getSuperClass().getName(); |
| } else { |
| subId = copyIds ? toolChild.getId() |
| : ManagedBuildManager.calculateChildId(toolChild.getId(), null); |
| // subName = toolChild.getName(); |
| } |
| } |
| |
| // The superclass for the cloned tool is not the same as the one from the tool being cloned. |
| // The superclasses reside in different configurations. |
| ITool toolSuperClass = null; |
| String superId = null; |
| // Search for the tool in this configuration that has the same grand-superClass as the |
| // tool being cloned |
| ITool otherSuperTool = toolChild.getSuperClass(); |
| if (otherSuperTool != null) { |
| if (otherSuperTool.isExtensionElement()) { |
| toolSuperClass = otherSuperTool; |
| } else { |
| IResourceInfo otherRcInfo = otherSuperTool.getParentResourceInfo(); |
| IResourceInfo thisRcInfo = cfg.getResourceInfo(otherRcInfo.getPath(), true); |
| ITool otherExtTool = ManagedBuildManager.getExtensionTool(otherSuperTool); |
| if (otherExtTool != null) { |
| if (thisRcInfo != null) { |
| ITool tools[] = thisRcInfo.getTools(); |
| for (int i = 0; i < tools.length; i++) { |
| ITool thisExtTool = ManagedBuildManager.getExtensionTool(tools[i]); |
| if (otherExtTool.equals(thisExtTool)) { |
| toolSuperClass = tools[i]; |
| superId = toolSuperClass.getId(); |
| break; |
| } |
| } |
| } else { |
| superId = copyIds ? otherSuperTool.getId() |
| : ManagedBuildManager.calculateChildId(otherExtTool.getId(), null); |
| Map<String, String> idMap = superClassIdMap.get(otherRcInfo.getPath()); |
| if (idMap == null) { |
| idMap = new HashMap<>(); |
| superClassIdMap.put(otherRcInfo.getPath(), idMap); |
| } |
| idMap.put(otherExtTool.getId(), superId); |
| } |
| } |
| } |
| } |
| // IToolChain tCh = cloneConfig.getBaseToolChain(); |
| // if(tCh != null){ |
| // if(!tCh.isExtensionElement()){ |
| // IFolderInfo fo = tCh.getParentFolderInfo(); |
| // IPath path = fo.getPath(); |
| // IResourceInfo baseFo = cfg.getResourceInfo(path, false); |
| // if(baseFo instanceof IFileInfo) |
| // baseFo = cfg.getResourceInfo(path.removeLastSegments(1), false); |
| // tCh = ((IFolderInfo)baseFo).getToolChain(); |
| // |
| // } |
| // ITool[] tools = tCh.getTools(); |
| // for (int i=0; i<tools.length; i++) { |
| // ITool configTool = tools[i]; |
| // if (toolChild.getSuperClass() != null |
| // && configTool.getSuperClass() == toolChild.getSuperClass().getSuperClass()) |
| // { |
| // toolSuperClass = configTool; |
| // break; |
| // } |
| // } |
| // } else { |
| // //TODO: |
| // } |
| |
| Tool newTool = null; |
| if (toolSuperClass != null) |
| newTool = new Tool(this, toolSuperClass, subId, subName, (Tool) toolChild); |
| else |
| newTool = new Tool(this, superId, subId, subName, (Tool) toolChild); |
| |
| addTool(newTool); |
| } |
| } |
| |
| if (copyIds) { |
| isDirty = cloneConfig.isDirty; |
| needsRebuild = cloneConfig.needsRebuild; |
| } else { |
| setDirty(true); |
| setRebuildState(true); |
| } |
| } |
| |
| public ResourceConfiguration(ResourceConfiguration baseInfo, IPath path, String id, String name) { |
| super(baseInfo, path, id, name); |
| |
| isExtensionResourceConfig = false; |
| setResourceData(new BuildFileData(this)); |
| |
| setManagedBuildRevision(baseInfo.getManagedBuildRevision()); |
| |
| // Copy the remaining attributes |
| toolsToInvoke = baseInfo.toolsToInvoke; |
| |
| rcbsApplicability = KIND_DISABLE_RCBS_TOOL; |
| |
| // Clone the resource configuration's tool children |
| if (baseInfo.toolList != null) { |
| for (ITool toolChild : baseInfo.getToolList()) { |
| ITool superTool = toolChild.getSuperClass(); |
| String baseId = superTool != null ? superTool.getId() : toolChild.getId(); |
| String subId = ManagedBuildManager.calculateChildId(baseId, null); |
| String subName = toolChild.getName(); |
| |
| Tool newTool = new Tool(this, superTool, subId, subName, (Tool) toolChild); |
| addTool(newTool); |
| } |
| } |
| |
| setDirty(true); |
| setRebuildState(true); |
| } |
| |
| /* |
| * E L E M E N T A T T R I B U T E R E A D E R S A N D W R I T E R S |
| */ |
| |
| /* (non-Javadoc) |
| * Loads the resource configuration information from the ManagedConfigElement |
| * specified in the argument. |
| * |
| * @param element Contains the resource configuration information |
| */ |
| protected void loadFromManifest(IManagedConfigElement element) { |
| ManagedBuildManager.putConfigElement(this, element); |
| |
| // toolsToInvoke |
| toolsToInvoke = SafeStringInterner.safeIntern(element.getAttribute(IResourceConfiguration.TOOLS_TO_INVOKE)); |
| |
| // rcbsApplicability |
| String rcbsApplicabilityStr = element.getAttribute(IResourceConfiguration.RCBS_APPLICABILITY); |
| if (rcbsApplicabilityStr == null || rcbsApplicabilityStr.equals(DISABLE_RCBS_TOOL)) { |
| rcbsApplicability = KIND_DISABLE_RCBS_TOOL; |
| } else if (rcbsApplicabilityStr.equals(APPLY_RCBS_TOOL_BEFORE)) { |
| rcbsApplicability = KIND_APPLY_RCBS_TOOL_BEFORE; |
| } else if (rcbsApplicabilityStr.equals(APPLY_RCBS_TOOL_AFTER)) { |
| rcbsApplicability = KIND_APPLY_RCBS_TOOL_AFTER; |
| } else if (rcbsApplicabilityStr.equals(APPLY_RCBS_TOOL_AS_OVERRIDE)) { |
| rcbsApplicability = KIND_APPLY_RCBS_TOOL_AS_OVERRIDE; |
| } |
| } |
| |
| /* (non-Javadoc) |
| * Initialize the resource configuration information from the XML element |
| * specified in the argument |
| * |
| * @param element An XML element containing the resource configuration information |
| */ |
| protected void loadFromProject(ICStorageElement element) { |
| // toolsToInvoke |
| if (element.getAttribute(IResourceConfiguration.TOOLS_TO_INVOKE) != null) { |
| toolsToInvoke = SafeStringInterner.safeIntern(element.getAttribute(IResourceConfiguration.TOOLS_TO_INVOKE)); |
| } |
| |
| // rcbsApplicability |
| if (element.getAttribute(IResourceConfiguration.RCBS_APPLICABILITY) != null) { |
| String rcbsApplicabilityStr = element.getAttribute(IResourceConfiguration.RCBS_APPLICABILITY); |
| if (rcbsApplicabilityStr == null || rcbsApplicabilityStr.equals(DISABLE_RCBS_TOOL)) { |
| rcbsApplicability = KIND_DISABLE_RCBS_TOOL; |
| } else if (rcbsApplicabilityStr.equals(APPLY_RCBS_TOOL_BEFORE)) { |
| rcbsApplicability = KIND_APPLY_RCBS_TOOL_BEFORE; |
| } else if (rcbsApplicabilityStr.equals(APPLY_RCBS_TOOL_AFTER)) { |
| rcbsApplicability = KIND_APPLY_RCBS_TOOL_AFTER; |
| } else if (rcbsApplicabilityStr.equals(APPLY_RCBS_TOOL_AS_OVERRIDE)) { |
| rcbsApplicability = KIND_APPLY_RCBS_TOOL_AS_OVERRIDE; |
| } |
| } |
| } |
| |
| /** |
| * Persist the resource configuration to the project file. |
| */ |
| @Override |
| public void serialize(ICStorageElement element) { |
| super.serialize(element); |
| if (toolsToInvoke != null) { |
| element.setAttribute(IResourceConfiguration.TOOLS_TO_INVOKE, toolsToInvoke); |
| } |
| |
| if (rcbsApplicability != null) { |
| String str; |
| switch (getRcbsApplicability()) { |
| case KIND_APPLY_RCBS_TOOL_BEFORE: |
| str = APPLY_RCBS_TOOL_BEFORE; |
| break; |
| case KIND_APPLY_RCBS_TOOL_AFTER: |
| str = APPLY_RCBS_TOOL_AFTER; |
| break; |
| case KIND_APPLY_RCBS_TOOL_AS_OVERRIDE: |
| str = APPLY_RCBS_TOOL_AS_OVERRIDE; |
| break; |
| case KIND_DISABLE_RCBS_TOOL: |
| str = DISABLE_RCBS_TOOL; |
| break; |
| default: |
| str = DISABLE_RCBS_TOOL; |
| break; |
| } |
| element.setAttribute(IResourceConfiguration.RCBS_APPLICABILITY, str); |
| } |
| |
| // Serialize my children |
| List<ITool> toolElements = getToolList(); |
| for (ITool tool : toolElements) { |
| ICStorageElement toolElement = element.createChild(ITool.TOOL_ELEMENT_NAME); |
| ((Tool) tool).serialize(toolElement); |
| } |
| |
| // I am clean now |
| setDirty(false); |
| } |
| |
| /* |
| * P A R E N T A N D C H I L D H A N D L I N G |
| */ |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.IResourceConfiguration#getTools() |
| */ |
| @Override |
| public ITool[] getTools() { |
| List<ITool> toolList = getToolList(); |
| ITool[] tools = new ITool[toolList.size()]; |
| int i = 0; |
| for (ITool tool : toolList) { |
| tools[i++] = tool; |
| } |
| return tools; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#getTool(java.lang.String) |
| */ |
| @Override |
| public ITool getTool(String id) { |
| Tool tool = (Tool) getToolMap().get(id); |
| return tool; |
| } |
| |
| /* (non-Javadoc) |
| * Safe accessor for the list of tools. |
| * |
| * @return List containing the tools |
| */ |
| private List<ITool> getToolList() { |
| if (toolList == null) { |
| toolList = new ArrayList<>(); |
| } |
| return toolList; |
| } |
| |
| /* (non-Javadoc) |
| * Safe accessor for the map of tool ids to tools |
| * |
| * @return |
| */ |
| private Map<String, ITool> getToolMap() { |
| if (toolMap == null) { |
| toolMap = new HashMap<>(); |
| } |
| return toolMap; |
| } |
| |
| /* (non-Javadoc) |
| * Adds the Tool to the Tool list and map |
| * |
| * @param Tool |
| */ |
| public void addTool(Tool tool) { |
| getToolList().add(tool); |
| getToolMap().put(tool.getId(), tool); |
| setRebuildState(true); |
| } |
| |
| /* (non-Javadoc) |
| * Removes the Tool from the Tool list and map |
| * |
| * @param Tool |
| */ |
| @Override |
| public void removeTool(ITool tool) { |
| getToolList().remove(tool); |
| getToolMap().remove(tool); |
| setRebuildState(true); |
| } |
| |
| /* |
| * M O D E L A T T R I B U T E A C C E S S O R S |
| */ |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#getResourcePath() |
| */ |
| @Override |
| public String getResourcePath() { |
| IPath path = getParent().getOwner().getProject().getFullPath(); |
| path = path.append(getPath()); |
| return path.toString(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#getRcbsApplicability() |
| */ |
| @Override |
| public int getRcbsApplicability() { |
| /* |
| * rcbsApplicability is an integer constant that represents how the user wants to |
| * order the application of a resource custom build step tool. |
| * Defaults to disable rcbs tool. |
| * Choices are before, after, or override other tools, or disable rcbs tool. |
| */ |
| if (rcbsApplicability == null) { |
| return KIND_DISABLE_RCBS_TOOL; |
| } |
| return rcbsApplicability.intValue(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#getToolsToInvoke() |
| */ |
| @Override |
| public ITool[] getToolsToInvoke() { |
| /* |
| * toolsToInvoke is an ordered list of tool ids for the currently defined tools in |
| * the resource configuration. |
| * Defaults to all tools in the order found. |
| * Modified by the presence of an rcbs tool and the currently assigned applicability of that tool. |
| * The attribute is implemented as a String of a semicolon separated list of tool ids. |
| * An empty string implies treat as if no resource configuration, i.e., use project level tool. |
| * This getter routine returns an ITool[] to consumers (i.e., the makefile generator). |
| */ |
| String t_ToolsToInvoke = ""; //$NON-NLS-1$ |
| ITool[] resConfigTools; |
| ITool[] tools; |
| String rcbsToolId = ""; //$NON-NLS-1$ |
| int len; |
| int j; |
| int rcbsToolIdx = -1; |
| resConfigTools = getTools(); |
| |
| /* |
| * Evaluate the tools currently defined in the resource configuration. |
| * Update the current state of the toolsToInvoke attribute. |
| * Build and return an ITool[] for consumers. |
| */ |
| |
| /* |
| * If no tools are currently defined, return a zero lengh array of ITool. |
| */ |
| if (resConfigTools.length == 0) { |
| toolsToInvoke = ""; //$NON-NLS-1$ |
| tools = new ITool[0]; |
| return tools; |
| } |
| |
| /* |
| * See if there is an rcbs tool defined. There should only be one at most. |
| */ |
| for (int i = 0; i < resConfigTools.length; i++) { |
| if (resConfigTools[i].getCustomBuildStep() && !resConfigTools[i].isExtensionElement()) { |
| rcbsToolId = resConfigTools[i].getId(); |
| rcbsToolIdx = i; |
| break; |
| } |
| } |
| if (!rcbsToolId.isEmpty()) { |
| /* |
| * Here if an rcbs tool is defined. |
| * Apply the tools according to the current rcbsApplicability setting. |
| */ |
| switch (rcbsApplicability.intValue()) { |
| case KIND_APPLY_RCBS_TOOL_AS_OVERRIDE: |
| toolsToInvoke = rcbsToolId; |
| tools = new ITool[1]; |
| tools[0] = resConfigTools[rcbsToolIdx]; |
| break; |
| case KIND_APPLY_RCBS_TOOL_AFTER: |
| j = 0; |
| tools = new ITool[resConfigTools.length]; |
| for (int i = 0; i < resConfigTools.length; i++) { |
| if (resConfigTools[i].getId() != rcbsToolId) { |
| t_ToolsToInvoke += resConfigTools[i].getId() + ";"; //$NON-NLS-1$ |
| tools[j++] = resConfigTools[i]; |
| } |
| } |
| t_ToolsToInvoke += rcbsToolId; |
| tools[j++] = resConfigTools[rcbsToolIdx]; |
| toolsToInvoke = t_ToolsToInvoke; |
| break; |
| case KIND_APPLY_RCBS_TOOL_BEFORE: |
| j = 0; |
| tools = new ITool[resConfigTools.length]; |
| t_ToolsToInvoke = rcbsToolId + ";"; //$NON-NLS-1$ |
| tools[j++] = resConfigTools[rcbsToolIdx]; |
| for (int i = 0; i < resConfigTools.length; i++) { |
| if (resConfigTools[i].getId() != rcbsToolId) { |
| t_ToolsToInvoke += resConfigTools[i].getId() + ";"; //$NON-NLS-1$ |
| tools[j++] = resConfigTools[i]; |
| } |
| } |
| len = t_ToolsToInvoke.length(); |
| t_ToolsToInvoke = t_ToolsToInvoke.substring(0, len - 1); |
| toolsToInvoke = t_ToolsToInvoke; |
| break; |
| case KIND_DISABLE_RCBS_TOOL: |
| /* |
| * If the rcbs tool is the only tool and the user has disabled it, |
| * there are no tools to invoke in the resource configuration. |
| */ |
| if (resConfigTools.length == 1) { |
| tools = new ITool[0]; |
| toolsToInvoke = ""; //$NON-NLS-1$ |
| break; |
| } |
| j = 0; |
| tools = new ITool[resConfigTools.length - 1]; |
| for (int i = 0; i < resConfigTools.length; i++) { |
| if (resConfigTools[i].getId() != rcbsToolId) { |
| t_ToolsToInvoke += resConfigTools[i].getId() + ";"; //$NON-NLS-1$ |
| tools[j++] = resConfigTools[i]; |
| } |
| } |
| len = t_ToolsToInvoke.length(); |
| t_ToolsToInvoke = t_ToolsToInvoke.substring(0, len - 1); |
| toolsToInvoke = t_ToolsToInvoke; |
| break; |
| default: |
| /* |
| * If we get an unexpected value, apply all tools in the order found. |
| */ |
| tools = new ITool[resConfigTools.length]; |
| for (int i = 0; i < resConfigTools.length; i++) { |
| t_ToolsToInvoke += resConfigTools[i].getId() + ";"; //$NON-NLS-1$ |
| tools[i] = resConfigTools[i]; |
| } |
| len = t_ToolsToInvoke.length(); |
| t_ToolsToInvoke = t_ToolsToInvoke.substring(0, len - 1); |
| toolsToInvoke = t_ToolsToInvoke; |
| break; |
| } |
| } else { |
| /* |
| * Here if no rcbs tool is defined, but there are other tools in the resource configuration. |
| * Specify all tools in the order found. |
| */ |
| tools = new ITool[resConfigTools.length]; |
| for (int i = 0; i < resConfigTools.length; i++) { |
| t_ToolsToInvoke += resConfigTools[i].getId() + ";"; //$NON-NLS-1$ |
| tools[i] = resConfigTools[i]; |
| } |
| len = t_ToolsToInvoke.length(); |
| t_ToolsToInvoke = t_ToolsToInvoke.substring(0, len - 1); |
| toolsToInvoke = t_ToolsToInvoke; |
| } |
| return tools; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#getRcbsApplicability() |
| */ |
| @Override |
| public void setRcbsApplicability(int newValue) { |
| /* |
| * rcbsApplicability is an integer constant that represents how the user wants to |
| * order the application of a resource custom build step tool. |
| * Defaults to override all other tools. |
| * Choices are before, after, or override other tools, or disable rcbs tool. |
| */ |
| if (rcbsApplicability == null || !(rcbsApplicability.intValue() == newValue)) { |
| rcbsApplicability = newValue; |
| setDirty(true); |
| setRebuildState(true); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#setResourcePath() |
| */ |
| @Override |
| public void setResourcePath(String path) { |
| if (path == null) |
| return; |
| IPath p = new Path(path).removeFirstSegments(1); |
| setPath(p); |
| } |
| |
| /* |
| * O B J E C T S T A T E M A I N T E N A N C E |
| */ |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#isExtensionElement() |
| */ |
| public boolean isExtensionResourceConfiguration() { |
| return isExtensionResourceConfig; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#isDirty() |
| */ |
| @Override |
| public boolean isDirty() { |
| // This shouldn't be called for an extension tool-chain |
| if (isExtensionResourceConfig) |
| return false; |
| |
| // If I need saving, just say yes |
| if (super.isDirty()) |
| return true; |
| |
| // Otherwise see if any tools need saving |
| for (ITool toolChild : getToolList()) { |
| if (toolChild.isDirty()) |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#setDirty(boolean) |
| */ |
| @Override |
| public void setDirty(boolean isDirty) { |
| if (isExtensionResourceConfig) |
| return; |
| |
| super.setDirty(isDirty); |
| |
| // Propagate "false" to the children |
| if (!isDirty) { |
| for (ITool toolChild : getToolList()) { |
| toolChild.setDirty(false); |
| } |
| } |
| } |
| |
| /* (non-Javadoc) |
| * Resolve the element IDs to interface references |
| */ |
| @Override |
| public void resolveReferences() { |
| if (!resolved) { |
| resolved = true; |
| |
| // Call resolveReferences on our children |
| for (ITool toolChild : getToolList()) { |
| ((Tool) toolChild).resolveReferences(); |
| } |
| } |
| } |
| |
| @Override |
| public ITool createTool(ITool superClass, String id, String name, boolean isExtensionElement) { |
| Tool tool = new Tool(this, superClass, id, name, isExtensionElement); |
| addTool(tool); |
| setDirty(true); |
| return tool; |
| } |
| |
| public void reset() { |
| // We just need to remove all Options |
| ITool[] tools = getTools(); |
| // Send out the event to notify the options that they are about to be removed |
| // ManagedBuildManager.performValueHandlerEvent(this, IManagedOptionValueHandler.EVENT_CLOSE); |
| // Remove the configurations |
| for (int i = 0; i < tools.length; i++) { |
| ITool tool = tools[i]; |
| IOption[] opts = tool.getOptions(); |
| for (int j = 0; j < opts.length; j++) { |
| tool.removeOption(opts[j]); |
| } |
| } |
| // setExclude(false); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#setToolCommand(org.eclipse.cdt.managedbuilder.core.ITool, java.lang.String) |
| */ |
| @Override |
| public void setToolCommand(ITool tool, String command) { |
| // TODO: Do we need to verify that the tool is part of the configuration? |
| tool.setToolCommand(command); |
| } |
| |
| // private IBuildObject getHoldersParent(IOption option) { |
| // IHoldsOptions holder = option.getOptionHolder(); |
| // if (holder instanceof ITool) { |
| // return ((ITool)holder).getParent(); |
| // } else if (holder instanceof IToolChain) { |
| // return ((IToolChain)holder).getParent(); |
| // } |
| // return null; |
| // } |
| |
| @Override |
| public IResource getOwner() { |
| return getParent().getOwner(); |
| } |
| |
| /** |
| * @return Returns the version. |
| */ |
| @Override |
| public Version getVersion() { |
| if (version == null) { |
| if (getParent() != null) { |
| return getParent().getVersion(); |
| } |
| } |
| return version; |
| } |
| |
| @Override |
| public void setVersion(Version version) { |
| // Do nothing |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.internal.core.BuildObject#updateManagedBuildRevision(java.lang.String) |
| */ |
| @Override |
| public void updateManagedBuildRevision(String revision) { |
| super.updateManagedBuildRevision(revision); |
| |
| for (ITool tool : getToolList()) { |
| ((Tool) tool).updateManagedBuildRevision(revision); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#needsRebuild() |
| */ |
| @Override |
| public boolean needsRebuild() { |
| if (super.needsRebuild()) |
| return true; |
| |
| ITool tools[] = getToolsToInvoke(); |
| for (int i = 0; i < tools.length; i++) { |
| if (tools[i].needsRebuild()) |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#setRebuildState(boolean) |
| */ |
| @Override |
| public void setRebuildState(boolean rebuild) { |
| if (isExtensionResourceConfiguration() && rebuild) |
| return; |
| |
| if (needsRebuild() != rebuild) { |
| super.setRebuildState(rebuild); |
| saveRebuildState(); |
| } |
| |
| if (!rebuild) { |
| ITool tools[] = getToolsToInvoke(); |
| for (int i = 0; i < tools.length; i++) { |
| tools[i].setRebuildState(false); |
| } |
| } |
| |
| } |
| |
| private void saveRebuildState() { |
| PropertyManager.getInstance().setProperty(this, REBUILD_STATE, Boolean.toString(needsRebuild())); |
| } |
| |
| @Override |
| public final int getKind() { |
| return ICSettingBase.SETTING_FILE; |
| } |
| |
| @Override |
| public CFileData getFileData() { |
| return (CFileData) getResourceData(); |
| } |
| |
| @Override |
| public CLanguageData[] getCLanguageDatas() { |
| ITool tools[] = getTools/*ToInvoke*/(); |
| List<CLanguageData> list = new ArrayList<>(); |
| for (ITool tool : tools) { |
| CLanguageData datas[] = tool.getCLanguageDatas(); |
| for (int j = 0; j < datas.length; j++) { |
| list.add(datas[j]); |
| } |
| } |
| return list.toArray(new BuildLanguageData[list.size()]); |
| } |
| |
| @Override |
| public IToolChain getBaseToolChain() { |
| ITool tools[] = getToolsToInvoke(); |
| ITool baseTool = null; |
| for (int i = 0; i < tools.length; i++) { |
| ITool tool = tools[i]; |
| ITool superTool = tool.getSuperClass(); |
| if (superTool != null) { |
| baseTool = superTool; |
| if (!superTool.isExtensionElement()) { |
| break; |
| } |
| } |
| } |
| |
| IToolChain baseTc = null; |
| if (baseTool != null) { |
| IBuildObject parent = baseTool.getParent(); |
| if (parent instanceof IToolChain) { |
| baseTc = (IToolChain) parent; |
| } else if (parent instanceof ResourceConfiguration) { |
| baseTc = ((ResourceConfiguration) parent).getBaseToolChain(); |
| } |
| } |
| |
| return baseTc; |
| } |
| |
| @Override |
| public boolean isExtensionElement() { |
| return isExtensionResourceConfig; |
| } |
| |
| @Override |
| public boolean supportsBuild(boolean managed) { |
| ITool tools[] = getToolsToInvoke(); |
| for (int i = 0; i < tools.length; i++) { |
| if (!tools[i].supportsBuild(managed)) |
| return false; |
| } |
| |
| return true; |
| } |
| |
| @Override |
| public Set<String> contributeErrorParsers(Set<String> set) { |
| return contributeErrorParsers(getToolsToInvoke(), set); |
| } |
| |
| @Override |
| public void resetErrorParsers() { |
| resetErrorParsers(getToolsToInvoke()); |
| } |
| |
| @Override |
| void removeErrorParsers(Set<String> set) { |
| removeErrorParsers(getToolsToInvoke(), set); |
| } |
| |
| @Override |
| void resolveProjectReferences(boolean onLoad) { |
| for (ITool tool : getToolList()) { |
| ((Tool) tool).resolveProjectReferences(onLoad); |
| } |
| } |
| |
| @Override |
| public boolean hasCustomSettings() { |
| IResourceInfo parentRc = getParentResourceInfo(); |
| if (parentRc instanceof FolderInfo) { |
| IPath path = getPath(); |
| String ext = path.getFileExtension(); |
| if (ext == null) |
| ext = ""; //$NON-NLS-1$ |
| ITool otherTool = ((FolderInfo) parentRc).getToolFromInputExtension(ext); |
| if (otherTool == null) |
| return true; |
| |
| ITool[] tti = getToolsToInvoke(); |
| if (tti.length != 1) |
| return true; |
| |
| return ((Tool) tti[0]).hasCustomSettings((Tool) otherTool); |
| } |
| ITool[] tools = getTools(); |
| ITool[] otherTools = ((IFileInfo) parentRc).getTools(); |
| if (tools.length != otherTools.length) |
| return true; |
| |
| for (int i = 0; i < tools.length; i++) { |
| Tool tool = (Tool) tools[i]; |
| Tool otherTool = (Tool) otherTools[i]; |
| if (tool.hasCustomSettings(otherTool)) |
| return true; |
| } |
| |
| return false; |
| } |
| |
| @Override |
| public void setTools(ITool[] tools) { |
| ToolListModificationInfo info = getToolListModificationInfo(tools); |
| info.apply(); |
| } |
| |
| @Override |
| public boolean isFolderInfo() { |
| return false; |
| } |
| |
| @Override |
| void applyToolsInternal(ITool[] resultingTools, ToolListModificationInfo info) { |
| List<ITool> list = getToolList(); |
| Map<String, ITool> map = getToolMap(); |
| |
| list.clear(); |
| map.clear(); |
| |
| list.addAll(Arrays.asList(resultingTools)); |
| for (int i = 0; i < resultingTools.length; i++) { |
| ITool tool = resultingTools[i]; |
| map.put(tool.getId(), tool); |
| } |
| |
| setRebuildState(true); |
| } |
| |
| @Override |
| public boolean isSupported() { |
| IFolderInfo foInfo = getParentFolderInfo(); |
| if (foInfo == null) { |
| IConfiguration cfg = getParent(); |
| if (cfg != null) { |
| foInfo = cfg.getRootFolderInfo(); |
| } |
| } |
| |
| if (foInfo != null) |
| return foInfo.isSupported(); |
| return false; |
| } |
| } |