blob: 828eea82bf1011e8e96fe9df8241a85c417f6267 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.managedbuilder.internal.core;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.StringTokenizer;
import org.eclipse.cdt.managedbuilder.core.BuildException;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IOption;
import org.eclipse.cdt.managedbuilder.core.IOptionCategory;
import org.eclipse.cdt.managedbuilder.core.ITarget;
import org.eclipse.cdt.managedbuilder.core.ITool;
import org.eclipse.core.runtime.IConfigurationElement;
/**
* Represents a tool that can be invoked during a build.
* Note that this class implements IOptionCategory to represent the top
* category.
*/
public class Tool extends BuildObject implements ITool, IOptionCategory {
private static final String DEFAULT_SEPARATOR = ",";
private static final IOptionCategory[] EMPTY_CATEGORIES = new IOptionCategory[0];
private static final IOption[] EMPTY_OPTIONS = new IOption[0];
private Map categoryMap;
private List childOptionCategories;
private String command;
private List inputExtensions;
private List interfaceExtensions;
private int natureFilter;
private Map optionMap;
private List options;
private String outputExtension;
private String outputFlag;
private String outputPrefix;
private ITarget target;
public Tool(Target target) {
this.target = target;
}
/**
* Constructor to create a new tool in the build model based on the information
* defined in the plugin.xml manifest.
*
* @param target The target the receiver will belong to.
* @param element The element containing the information.
*/
public Tool(Target target, IConfigurationElement element) {
this(target);
// id
setId(element.getAttribute(ITool.ID));
// hook me up
target.addTool(this);
// name
setName(element.getAttribute(ITool.NAME));
// Get the nature filter
String nature = element.getAttribute(NATURE);
if (nature == null || "both".equals(nature)) {
natureFilter = FILTER_BOTH;
} else if ("cnature".equals(nature)) {
natureFilter = FILTER_C;
} else if ("ccnature".equals(nature)) {
natureFilter = FILTER_CC;
} else {
natureFilter = FILTER_BOTH;
}
// Get the supported input file extension
String inputs = element.getAttribute(ITool.SOURCES) == null ?
new String() :
element.getAttribute(ITool.SOURCES);
StringTokenizer tokenizer = new StringTokenizer(inputs, DEFAULT_SEPARATOR);
while (tokenizer.hasMoreElements()) {
getInputExtensions().add(tokenizer.nextElement());
}
// Get the interface (header file) extensions
String headers = element.getAttribute(INTERFACE_EXTS);
if (headers == null) {
headers = new String();
}
tokenizer = new StringTokenizer(headers, DEFAULT_SEPARATOR);
while (tokenizer.hasMoreElements()) {
getInterfaceExtensions().add(tokenizer.nextElement());
}
// Get the output extension
outputExtension = element.getAttribute(ITool.OUTPUTS) == null ?
new String() :
element.getAttribute(ITool.OUTPUTS);
// Get the tool invocation
command = element.getAttribute(ITool.COMMAND) == null ?
new String() :
element.getAttribute(ITool.COMMAND);
// Get the flag to control output
outputFlag = element.getAttribute(ITool.OUTPUT_FLAG) == null ?
new String() :
element.getAttribute(ITool.OUTPUT_FLAG);
// Get the output prefix
outputPrefix = element.getAttribute(ITool.OUTPUT_PREFIX) == null ?
new String() :
element.getAttribute(ITool.OUTPUT_PREFIX);
// set up the category map
categoryMap = new HashMap();
addOptionCategory(this);
// Check for options
IConfigurationElement[] toolElements = element.getChildren();
for (int l = 0; l < toolElements.length; ++l) {
IConfigurationElement toolElement = toolElements[l];
if (toolElement.getName().equals(ITool.OPTION)) {
new Option(this, toolElement);
} else if (toolElement.getName().equals(ITool.OPTION_CAT)) {
new OptionCategory(this, toolElement);
}
}
}
public IOptionCategory getOptionCategory(String id) {
return (IOptionCategory)categoryMap.get(id);
}
void addOptionCategory(IOptionCategory category) {
categoryMap.put(category.getId(), category);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.ITool#handlesFileType(java.lang.String)
*/
public boolean buildsFileType(String extension) {
if (extension == null) {
return false;
}
return getInputExtensions().contains(extension);
}
void addChildCategory(IOptionCategory category) {
if (childOptionCategories == null)
childOptionCategories = new ArrayList();
childOptionCategories.add(category);
}
public IOption[] getOptions() {
if (options != null)
return (IOption[])options.toArray(new IOption[options.size()]);
else
return EMPTY_OPTIONS;
}
public void addOption(Option option) {
if (options == null) {
options = new ArrayList();
optionMap = new HashMap();
}
options.add(option);
optionMap.put(option.getId(), option);
}
public IOptionCategory getTopOptionCategory() {
return this;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.IOptionCategory#getChildCategories()
*/
public IOptionCategory[] getChildCategories() {
if (childOptionCategories != null)
return (IOptionCategory[])childOptionCategories.toArray(new IOptionCategory[childOptionCategories.size()]);
else
return EMPTY_CATEGORIES;
}
/* (non-Javadoc)
* Safe accessor method to retrieve the list of valid source extensions
* the receiver know how to build.
*
* @return List
*/
private List getInputExtensions() {
if (inputExtensions == null) {
inputExtensions = new ArrayList();
}
return inputExtensions;
}
private List getInterfaceExtensions() {
if (interfaceExtensions == null) {
interfaceExtensions = new ArrayList();
}
return interfaceExtensions;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.IOptionCategory#createChildCategory()
*/
public IOptionCategory createChildCategory() {
IOptionCategory category = new OptionCategory(this);
if (childOptionCategories == null)
childOptionCategories = new ArrayList();
childOptionCategories.add(category);
return category;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.ITool#getOutputFlag()
*/
public String getOutputFlag() {
return outputFlag == null ? new String() : outputFlag.trim();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.ITool#getOutputPrefix()
*/
public String getOutputPrefix() {
return outputPrefix == null ? new String() : outputPrefix.trim();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.IOptionCategory#getOwner()
*/
public IOptionCategory getOwner() {
return null;
}
public ITarget getTarget() {
return target;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.IOptionCategory#getTool()
*/
public ITool getTool() {
return this;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.ITool#getToolCommand()
*/
public String getToolCommand() {
return command.trim();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.ITool#getToolFlags()
*/
public String getToolFlags() throws BuildException {
// Get all of the options
StringBuffer buf = new StringBuffer();
IOption[] opts = getOptions();
for (int index = 0; index < opts.length; index++) {
IOption option = opts[index];
switch (option.getValueType()) {
case IOption.BOOLEAN :
if (option.getBooleanValue()) {
buf.append(option.getCommand() + WHITE_SPACE);
}
break;
case IOption.ENUMERATED :
String enum = option.getEnumCommand(option.getSelectedEnum());
if (enum.length() > 0) {
buf.append(enum + WHITE_SPACE);
}
break;
case IOption.STRING :
String val = option.getStringValue();
if (val.length() > 0) {
buf.append(val + WHITE_SPACE);
}
break;
case IOption.STRING_LIST :
String listCmd = option.getCommand();
String[] list = option.getStringListValue();
for (int j = 0; j < list.length; j++) {
String temp = list[j];
buf.append(listCmd + temp + WHITE_SPACE);
}
break;
case IOption.INCLUDE_PATH :
String incCmd = option.getCommand();
String[] paths = option.getIncludePaths();
for (int j = 0; j < paths.length; j++) {
String temp = paths[j];
buf.append(incCmd + temp + WHITE_SPACE);
}
break;
case IOption.PREPROCESSOR_SYMBOLS :
String defCmd = option.getCommand();
String[] symbols = option.getDefinedSymbols();
for (int j = 0; j < symbols.length; j++) {
String temp = symbols[j];
buf.append(defCmd + temp + WHITE_SPACE);
}
break;
default :
break;
}
}
return buf.toString().trim();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.IOptionCategory#getOptions(org.eclipse.cdt.core.build.managed.ITool)
*/
public IOption[] getOptions(IConfiguration configuration) {
ITool tool = this;
if (configuration != null) {
// TODO don't like this much
ITool[] tools = configuration.getTools();
for (int i = 0; i < tools.length; ++i) {
if (tools[i] instanceof ToolReference) {
if (((ToolReference)tools[i]).references(tool)) {
tool = tools[i];
break;
}
} else if (tools[i].equals(tool))
break;
}
}
IOption[] allOptions = tool.getOptions();
ArrayList myOptions = new ArrayList();
for (int i = 0; i < allOptions.length; ++i) {
IOption option = allOptions[i];
if (option.getCategory().equals(this))
myOptions.add(option);
}
myOptions.trimToSize();
return (IOption[])myOptions.toArray(new IOption[myOptions.size()]);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.managedbuilder.core.ITool#getNatureFilter()
*/
public int getNatureFilter() {
return natureFilter;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.ITool#getOption(java.lang.String)
*/
public IOption getOption(String id) {
return (IOption)optionMap.get(id);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.ITool#getOutput(java.lang.String)
*/
public String getOutputExtension(String inputExtension) {
// Examine the list of input extensions
ListIterator iter = getInputExtensions().listIterator();
while (iter.hasNext()) {
if (((String)iter.next()).equals(inputExtension)) {
return outputExtension;
}
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.managedbuilder.core.ITool#isHeaderFile(java.lang.String)
*/
public boolean isHeaderFile(String ext) {
if (ext == null) {
return false;
}
return getInterfaceExtensions().contains(ext);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.ITool#producesFileType(java.lang.String)
*/
public boolean producesFileType(String outputExtension) {
return this.outputExtension.equals(outputExtension);
}
}