diff --git a/tools-ng/common/src/build.xml b/tools-ng/common/src/build.xml
new file mode 100755
index 000000000..141f1a208
--- /dev/null
+++ b/tools-ng/common/src/build.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tools-ng/common/src/com/redhat/ccm/config/ConfigHelper.java b/tools-ng/common/src/com/redhat/ccm/config/ConfigHelper.java
new file mode 100755
index 000000000..c3f1f3b50
--- /dev/null
+++ b/tools-ng/common/src/com/redhat/ccm/config/ConfigHelper.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2001 ArsDigita Corporation. All Rights Reserved.
+ *
+ * The contents of this file are subject to the ArsDigita Public
+ * License (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of
+ * the License at http://www.arsdigita.com/ADPL.txt
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ */
+
+package com.redhat.ccm.config;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.apache.oro.text.perl.Perl5Util;
+import org.apache.oro.text.regex.MatchResult;
+import org.apache.oro.text.regex.Pattern;
+import org.apache.oro.text.regex.Perl5Matcher;
+import org.apache.oro.text.regex.Perl5Compiler;
+import org.apache.oro.text.regex.PatternMatcher;
+import org.apache.oro.text.regex.PatternMatcherInput;
+import org.apache.oro.text.regex.Substitution;
+import org.apache.oro.text.regex.Util;
+import org.apache.oro.text.regex.MalformedPatternException;
+
+public class ConfigHelper {
+
+ public static void loadVariables(BufferedReader in,
+ Map vars)
+ throws IOException {
+
+ Perl5Util perl5 = new Perl5Util();
+
+ String line;
+ int number = 0;
+ while ((line = in.readLine()) != null) {
+ number++;
+
+ if (perl5.match("/^\\s*$/", line) ||
+ perl5.match("/^\\s*#/", line)) {
+ continue;
+ } else if (perl5.match("/\\s*((?:\\w|-)+)\\s*=\\s*(.*?)\\s*$/", line)) {
+ MatchResult result = perl5.getMatch();
+ String key = result.group(1);
+ String value = result.group(2);
+
+ vars.put(key, value);
+ } else {
+ throw new RuntimeException("syntax error in config file at " +
+ "line " + line);
+ }
+ }
+ }
+
+ public static String extractVariables(BufferedReader in,
+ Map vars)
+ throws IOException {
+
+ String firstLine = "";
+ Perl5Util perl5 = new Perl5Util();
+
+ String line;
+ int number = 0;
+ while ((line = in.readLine()) != null) {
+ if (perl5.match("/^\\s*\\/\\/\\s*::((?:\\w|-)+)::\\s*->\\s*(.*?)\\s*$/",
+ line)) {
+ MatchResult result = perl5.getMatch();
+ String key = result.group(1);
+ String value = result.group(2);
+
+ if (!vars.containsKey(key)) {
+ vars.put(key, value);
+ }
+ } else if (perl5.match("/^\\s*\\/\\/\\s*(.*?)\\s*$/",
+ line) && number == 0) {
+ MatchResult result = perl5.getMatch();
+ firstLine = result.group(1);
+ }
+ number++;
+ }
+ return (firstLine);
+ }
+
+
+ public static String interpolate(String text,
+ Map vars) {
+ HashSubstitution subst = new HashSubstitution(vars);
+ Perl5Matcher matcher = new Perl5Matcher();
+ Perl5Compiler compiler = new Perl5Compiler();
+ StringBuffer result = new StringBuffer();
+ PatternMatcherInput input = new PatternMatcherInput(text);
+
+ try {
+ Util.substitute(result,
+ matcher,
+ compiler.compile("(::(?:\\w|-)+::)"),
+ subst,
+ input,
+ Util.SUBSTITUTE_ALL);
+ } catch (MalformedPatternException e) {
+ e.printStackTrace();
+ throw new RuntimeException("cannot perform substitution: " +
+ e.getMessage());
+ }
+ return result.toString();
+ }
+
+ public static void loadVariablesFromString(String in, Map vars) {
+ Perl5Util perl5 = new Perl5Util();
+ ArrayList arraylist = new ArrayList();
+
+ if (in != null) {
+ perl5.split(arraylist, "/,/", in);
+
+ Iterator iter = arraylist.iterator();
+ while (iter.hasNext()) {
+ String key = (String)iter.next();
+ if (!iter.hasNext()) {
+ throw new RuntimeException("mismatched number of " +
+ "elements in: " + in);
+ }
+ String value = (String)iter.next();
+ vars.put(key, value);
+ }
+ }
+ }
+
+ public static void interpolateVars(Map vars1, Map vars2) {
+ Iterator keys = vars1.keySet().iterator();
+
+ while (keys.hasNext()) {
+ Object key = keys.next();
+ vars1.put(key, interpolate((String)vars1.get(key), vars2));
+ }
+ }
+
+ public static void interpolateVars(Map[] vars1, Map[] vars2) {
+ Map combined = new TreeMap();
+ for (int i = 0; i < vars2.length; i++) {
+ combined.putAll(vars2[i]);
+ }
+
+ for (int i = 0; i < vars1.length; i++) {
+
+ Iterator keys = vars1[i].keySet().iterator();
+
+ while (keys.hasNext()) {
+ Object key = keys.next();
+ vars1[i].put(key, interpolate((String)vars1[i].get(key), combined));
+ }
+ }
+ }
+
+
+ private static class HashSubstitution implements Substitution {
+ private Map m_hash;
+
+ public HashSubstitution(Map hash) {
+ m_hash = hash;
+ }
+
+ public void appendSubstitution(StringBuffer appendBuffer,
+ MatchResult match,
+ int substitutionCount,
+ PatternMatcherInput originalInput,
+ PatternMatcher matcher,
+ Pattern pattern) {
+ String placeholder = match.toString();
+ String key = placeholder.substring(2, placeholder.length()-2);
+
+ Object value = (m_hash.containsKey(key) ?
+ m_hash.get(key) :
+ placeholder);
+ String val;
+ try {
+ PlaceholderValueGenerator gen = (PlaceholderValueGenerator)value;
+ val = gen.generate();
+ } catch (ClassCastException ex) {
+ val = (String)value;
+ }
+
+ appendBuffer.append(val);
+ }
+ }
+
+ public interface PlaceholderValueGenerator {
+ public String generate();
+ }
+
+}
diff --git a/tools-ng/common/src/com/redhat/ccm/config/IntegrateConfig.java b/tools-ng/common/src/com/redhat/ccm/config/IntegrateConfig.java
new file mode 100755
index 000000000..782391bb3
--- /dev/null
+++ b/tools-ng/common/src/com/redhat/ccm/config/IntegrateConfig.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2001 ArsDigita Corporation. All Rights Reserved.
+ *
+ * The contents of this file are subject to the ArsDigita Public
+ * License (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of
+ * the License at http://www.arsdigita.com/ADPL.txt
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ */
+
+package com.redhat.ccm.config;
+
+import java.util.TreeMap;
+import java.util.Iterator;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.FileNotFoundException;
+
+public class IntegrateConfig {
+ public static void main(String args[]) {
+ try {
+ BufferedReader conf = new BufferedReader(new FileReader(args[0]));
+
+ TreeMap vars = new TreeMap();
+ ConfigHelper.loadVariables(conf, vars);
+ conf.close();
+
+ for (int i = 2 ; i < args.length ; i++) {
+ BufferedReader in = new BufferedReader(new FileReader(args[i]));
+
+ ConfigHelper.extractVariables(in, vars);
+
+ in.close();
+ }
+
+ BufferedWriter out = new BufferedWriter(new FileWriter(args[1]));
+ printVariables(out, vars);
+ out.close();
+ } catch (FileNotFoundException ex) {
+ ex.printStackTrace();
+ throw new RuntimeException(ex.getMessage());
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ throw new RuntimeException(ex.getMessage());
+ }
+ }
+
+
+ public static void printVariables(BufferedWriter out,
+ TreeMap vars)
+ throws IOException {
+
+ Iterator keys = vars.keySet().iterator();
+ while (keys.hasNext()) {
+ String key = (String)keys.next();
+ String value = (String)vars.get(key);
+
+ String line = key + " = " + value;
+
+ out.write(line, 0, line.length());
+ out.newLine();
+ }
+ }
+
+}
diff --git a/tools-ng/common/src/com/redhat/ccm/config/MakeConfig.java b/tools-ng/common/src/com/redhat/ccm/config/MakeConfig.java
new file mode 100755
index 000000000..3eff92f94
--- /dev/null
+++ b/tools-ng/common/src/com/redhat/ccm/config/MakeConfig.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2001 ArsDigita Corporation. All Rights Reserved.
+ *
+ * The contents of this file are subject to the ArsDigita Public
+ * License (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of
+ * the License at http://www.arsdigita.com/ADPL.txt
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ */
+
+package com.redhat.ccm.config;
+
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.TreeMap;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.FileNotFoundException;
+
+public class MakeConfig {
+
+ public static void main(String args[]) {
+ try {
+ TreeMap vars[] = new TreeMap[args.length];
+ String labels[] = new String[args.length];
+
+ for (int i = 1 ; i < args.length ; i++) {
+ BufferedReader in = new BufferedReader(new FileReader(args[i]));
+ TreeMap theseVars = new TreeMap();
+
+ labels[i - 1] = ConfigHelper.extractVariables(in, theseVars);
+
+ vars[i - 1] = theseVars;
+
+ in.close();
+ }
+
+ String projectVars = System.getProperty("projectVars");
+ TreeMap theseVars = new TreeMap();
+ ConfigHelper.loadVariablesFromString(projectVars,theseVars);
+ labels[args.length - 1] = "System Properties";
+ vars[args.length - 1] = theseVars;
+
+ ConfigHelper.interpolateVars(vars, vars);
+
+ BufferedWriter out = new BufferedWriter(new FileWriter(args[0]));
+ printVariables(out, vars, labels);
+ out.close();
+ } catch (FileNotFoundException ex) {
+ ex.printStackTrace();
+ throw new RuntimeException(ex.getMessage());
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ throw new RuntimeException(ex.getMessage());
+ }
+ }
+
+
+ public static void printVariables(BufferedWriter out,
+ TreeMap[] vars,
+ String[] labels)
+ throws IOException {
+
+ HashSet allvars = new HashSet();
+ String text = "";
+
+ for (int i = vars.length - 1; i >= 0; i--) {
+ StringBuffer sb = new StringBuffer();
+
+ if (labels[i] != null && vars[i].size() > 0) {
+ sb.append("# " + labels[i] + System.getProperty("line.separator"));
+ }
+
+ Iterator keys = vars[i].keySet().iterator();
+ while (keys.hasNext()) {
+ String key = (String)keys.next();
+ if (! allvars.contains(key)) {
+ allvars.add(key);
+ String value = (String)vars[i].get(key);
+ String line = key + " = " + value;
+
+ sb.append(line + System.getProperty("line.separator"));
+ }
+ }
+ if (vars[i].size() > 0) {
+ sb.append(System.getProperty("line.separator"));
+ }
+ text = sb + text;
+ }
+ out.write(text, 0, text.length());
+ }
+}
diff --git a/tools-ng/common/src/com/redhat/ccm/config/MakeInit.java b/tools-ng/common/src/com/redhat/ccm/config/MakeInit.java
new file mode 100755
index 000000000..202d7b16e
--- /dev/null
+++ b/tools-ng/common/src/com/redhat/ccm/config/MakeInit.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2001 ArsDigita Corporation. All Rights Reserved.
+ *
+ * The contents of this file are subject to the ArsDigita Public
+ * License (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of
+ * the License at http://www.arsdigita.com/ADPL.txt
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ */
+
+package com.redhat.ccm.config;
+
+import java.util.TreeMap;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.FileNotFoundException;
+
+public class MakeInit {
+
+ public static void main(String args[]) {
+ try {
+ BufferedReader conf = new BufferedReader(new FileReader(args[0]));
+
+ TreeMap vars = new TreeMap();
+ ConfigHelper.loadVariables(conf, vars);
+ conf.close();
+
+ BufferedWriter out1 = new BufferedWriter(new FileWriter(args[1]));
+ BufferedWriter out2 = new BufferedWriter(new FileWriter(args[2]));
+
+ for (int i = 3 ; i < args.length ; i++) {
+ BufferedReader in = new BufferedReader(new FileReader(args[i]));
+
+ interpolate(in, out1, out2, vars);
+
+ in.close();
+ }
+
+ out1.close();
+ out2.close();
+ } catch (FileNotFoundException ex) {
+ ex.printStackTrace();
+ throw new RuntimeException(ex.getMessage());
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ throw new RuntimeException(ex.getMessage());
+ }
+ }
+
+
+ public static void interpolate(BufferedReader in,
+ BufferedWriter out1,
+ BufferedWriter out2,
+ TreeMap vars)
+ throws IOException {
+
+ String line;
+ while ((line = in.readLine()) != null) {
+ String result = line.startsWith("//") ?
+ line :
+ ConfigHelper.interpolate(line, vars);
+ out1.write(result, 0, result.length());
+ out1.newLine();
+ out2.write(line, 0, line.length());
+ out2.newLine();
+ }
+ }
+
+}
diff --git a/tools-ng/common/src/com/redhat/ccm/tools/ant/taskdefs/JDOEnhance.java b/tools-ng/common/src/com/redhat/ccm/tools/ant/taskdefs/JDOEnhance.java
new file mode 100755
index 000000000..bf7d0614e
--- /dev/null
+++ b/tools-ng/common/src/com/redhat/ccm/tools/ant/taskdefs/JDOEnhance.java
@@ -0,0 +1,255 @@
+package com.redhat.ccm.tools.ant.taskdefs;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.FileScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.ExecuteJava;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.taskdefs.MatchingTask;
+import org.apache.tools.ant.types.Commandline;
+import org.apache.tools.ant.types.CommandlineJava;
+import org.apache.tools.ant.types.DirSet;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Mapper;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.Reference;
+import org.apache.tools.ant.util.FileNameMapper;
+import org.apache.tools.ant.util.GlobPatternMapper;
+import org.apache.tools.ant.util.IdentityMapper;
+import org.apache.tools.ant.util.SourceFileScanner;
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.Enumeration;
+import java.util.Vector;
+
+/**
+ * JDO enhancement task.
+ *
+ * @author Dennis Gregorovic dgregor@redhat.com
+ */
+public class JDOEnhance extends MatchingTask {
+
+ private CommandlineJava m_cmdline = new CommandlineJava();
+ private File m_destination = null;
+ private File[] m_enhanceList = new File[0];
+ private Mapper m_mapperElement = null;
+ private Path m_source = null;
+ //private Path m_classes = null;
+ private Path m_jdo = null;
+ private Vector m_classes = new Vector();
+ private final static String DEFAULT_CLASSNAME = "com.sun.jdori.enhancer.Main";
+
+ public JDOEnhance() {
+ m_cmdline.setClassname(DEFAULT_CLASSNAME);
+ }
+
+ public File getDestination() {
+ return m_destination;
+ }
+
+ public Path getSource() {
+ return m_source;
+ }
+
+ public void setClasspath(Path s) {
+ createClasspath().append(s);
+ }
+ public void setClasspathRef(Reference r) {
+ createClasspath().setRefid(r);
+ }
+ public Path createClasspath() {
+ return m_cmdline.createClasspath(project).createPath();
+ }
+
+ /**
+ * The name of the class that does the enhancement
+ */
+ public void setClassname(String classname) {
+ m_cmdline.setClassname(classname);
+ }
+
+ /**
+ * The directory that the enhanced class files will be written to.
+ */
+ public void setDestination(File destination) {
+ m_destination = destination;
+ }
+
+ /**
+ * The source path for jdo and class files
+ */
+ public void setSource(Path source) {
+ //m_source = source;
+ }
+
+ public Path createSrcpath() {
+ if (m_source == null) {
+ m_source = new Path(project);
+ }
+ return m_source.createPath();
+ }
+
+ public void addDirset(DirSet set) {
+ m_classes.addElement(set);
+ }
+
+ //public Path createClasses() {
+ // if (m_classes == null) {
+ // m_classes = new Path(project);
+ // }
+ // return m_classes.createPath();
+ //}
+
+ public Path createJdo() {
+ if (m_jdo == null) {
+ m_jdo = new Path(project);
+ }
+ return m_jdo.createPath();
+ }
+
+ /**
+ * Defines the mapper to map source to destination files.
+ */
+ public Mapper createMapper() throws BuildException {
+ if (m_mapperElement != null) {
+ throw new BuildException("Cannot define more than one mapper",
+ location);
+ }
+ m_mapperElement = new Mapper(project);
+ return m_mapperElement;
+ }
+
+ public void execute() throws BuildException {
+
+ log("running jdoenhance target", Project.MSG_VERBOSE);
+ // compare source files with target directory to figure out which files
+ // need to be enhanced
+
+ for (int i = 0; i < m_classes.size(); i++) {
+ DirSet dirset = (DirSet) m_classes.elementAt(i);
+ File fromDir = dirset.getDir(project);
+ DirectoryScanner ds = dirset.getDirectoryScanner(project);
+ String[] srcDirs = ds.getIncludedDirectories();
+ log(fromDir.toString(), Project.MSG_VERBOSE);
+ for (int j = 0; j < srcDirs.length; j++) {
+ log(srcDirs[j].toString(), Project.MSG_VERBOSE);
+ }
+ log(m_destination.toString(), Project.MSG_VERBOSE);
+ scanDir(fromDir, m_destination, srcDirs);
+ }
+
+ if (m_enhanceList.length > 0) {
+ log("Enhancing " + m_enhanceList.length +
+ " class file"
+ + (m_enhanceList.length == 1 ? "" : "s"));
+
+ Path newPath = new Path(project);
+ newPath.addExisting(m_source);
+ m_cmdline.createArgument().setValue("-s");
+ m_cmdline.createArgument().setValue(newPath.toString());
+
+ m_cmdline.createArgument().setValue("-d");
+ m_cmdline.createArgument().setValue(getDestination().getAbsolutePath());
+
+ for (int i = 0; i < m_enhanceList.length; i++) {
+ String arg = m_enhanceList[i].getAbsolutePath();
+ m_cmdline.createArgument().setValue(arg);
+ }
+
+ String[] jdo_list = m_jdo.list();
+ String[] includes = { "**/*.jdo" };
+ for (int i = 0; i < jdo_list.length; i++) {
+ File jdoDir = project.resolveFile(jdo_list[i]);
+ DirectoryScanner ds = getDirectoryScanner(jdoDir);
+ ds.setIncludes(includes);
+ ds.scan();
+ String[] jdo_files = ds.getIncludedFiles();
+ for (int j = 0; j < jdo_files.length; j++) {
+ File arg = new File(ds.getBasedir(), jdo_files[j]);
+ m_cmdline.createArgument().setValue(arg.getAbsolutePath());
+ }
+ }
+ log(m_cmdline.describeCommand(), Project.MSG_VERBOSE);
+ run(m_cmdline.getCommandline());
+ }
+ }
+
+ /**
+ * Scans the directory looking for class files to be enhanced.
+ */
+ protected void scanDir(File srcDir, File destDir, String[] dirs) {
+ log(srcDir.toString(), Project.MSG_VERBOSE);
+ log(destDir.toString(), Project.MSG_VERBOSE);
+ FileNameMapper mapper = null;
+ if (m_mapperElement != null) {
+ mapper = m_mapperElement.getImplementation();
+ } else {
+ mapper = new IdentityMapper();
+ }
+ FilenameFilter classFileFilter = new FilenameFilter() {
+ public boolean accept( File dir, String name ) {
+ if ( name.endsWith(".class") &&
+ name.indexOf("$") == -1 ) {
+ return true;
+ }
+ return false;
+ }
+ };
+ SourceFileScanner sfs = new SourceFileScanner(this);
+ for (int i = 0; i < dirs.length; i++) {
+ File dir = new File(srcDir, dirs[i]);
+ log(dir.toString(), Project.MSG_VERBOSE);
+ String[] files = dir.list(classFileFilter);
+ for (int j = 0; j < files.length; j++) {
+ files[j] = (new File(dirs[i], files[j])).toString();
+ }
+ File[] newFiles = sfs.restrictAsFiles(files, srcDir, destDir, mapper);
+ if (newFiles.length > 0) {
+ File[] newEnhanceList = new File[m_enhanceList.length + newFiles.length];
+ System.arraycopy(m_enhanceList, 0,
+ newEnhanceList, 0,
+ m_enhanceList.length);
+ System.arraycopy(newFiles, 0,
+ newEnhanceList, m_enhanceList.length,
+ newFiles.length);
+ m_enhanceList = newEnhanceList;
+ }
+ }
+ }
+
+ private void run(CommandlineJava command) throws BuildException {
+ Path newPath = new Path(project);
+ newPath.addExisting(command.getClasspath());
+ ExecuteJava exe = new ExecuteJava();
+ exe.setJavaCommand(command.getJavaCommand());
+ exe.setClasspath(newPath);
+ exe.setSystemProperties(command.getSystemProperties());
+ exe.execute(project);
+ }
+
+ /**
+ * Executes the given classname with the given arguments in a separate VM.
+ */
+ private int run(String[] command) throws BuildException {
+ Execute exe = null;
+ exe = new Execute(new LogStreamHandler(this, Project.MSG_INFO,
+ Project.MSG_WARN));
+ exe.setAntRun(project);
+ exe.setWorkingDirectory(project.getBaseDir());
+ exe.setCommandline(command);
+ try {
+ int rc = exe.execute();
+ if (exe.killedProcess()) {
+ log("Timeout: killed the sub-process", Project.MSG_WARN);
+ }
+ return rc;
+ } catch (IOException e) {
+ throw new BuildException(e, location);
+ }
+ }
+}