| /******************************************************************************* |
| * Copyright (c) 2000, 2017 IBM 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: |
| * OSGi bundles (bug 174157) |
| *******************************************************************************/ |
| package org.eclipse.pde.internal.build.ant; |
| |
| import java.io.*; |
| import java.net.URI; |
| import java.nio.charset.StandardCharsets; |
| import java.util.*; |
| import java.util.Map.Entry; |
| import org.eclipse.core.runtime.URIUtil; |
| import org.eclipse.pde.build.IAntScript; |
| |
| /** |
| * Class for producing Ant scripts. Contains convenience methods for creating the |
| * XML elements required for Ant scripts. See the <a href="http://jakarta.apache.org/ant">Ant</a> |
| * website for more details on Ant scripts and the particular Ant tasks. |
| */ |
| public class AntScript implements IAntScript { |
| |
| protected OutputStream out; |
| protected PrintWriter output; |
| protected final String XML_PROLOG = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; //$NON-NLS-1$ |
| protected int indent = 0; |
| |
| /** |
| * Constructor for the class. |
| * |
| * @param out the output stream to write the script to |
| * @throws IOException |
| */ |
| public AntScript(OutputStream out) throws IOException { |
| this.out = out; |
| output = new PrintWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8)); |
| output.println(XML_PROLOG); |
| } |
| |
| /** |
| * Close the output stream. |
| */ |
| public void close() { |
| output.flush(); |
| output.close(); |
| |
| // introduced because sometimes the file was not closed. |
| try { |
| out.close(); |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| /** |
| * Print an <code>antcall</code> task to the script. This calls Ant on the given |
| * target which is located within the same build file. |
| * |
| * @param target the target of the ant call |
| * @param inheritAll <code>true</code> if the parameters should be pass to the |
| * called target |
| * @param params table of parameters for the call |
| */ |
| @Override |
| public void printAntCallTask(String target, boolean inheritAll, Map<String, String> params) { |
| printTab(); |
| output.print("<antcall"); //$NON-NLS-1$ |
| printAttribute("target", target, true); //$NON-NLS-1$ |
| if (inheritAll == false) |
| printAttribute("inheritAll", "false", false); //$NON-NLS-1$ //$NON-NLS-2$ |
| if (params == null) |
| output.println("/>"); //$NON-NLS-1$ |
| else { |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| Set<Map.Entry<String, String>> entries = params.entrySet(); |
| for (Iterator<Map.Entry<String, String>> iter = entries.iterator(); iter.hasNext();) { |
| Entry<String, String> entry = iter.next(); |
| printParam(entry.getKey(), entry.getValue()); |
| } |
| indent--; |
| printTab(); |
| output.println("</antcall>"); //$NON-NLS-1$ |
| } |
| } |
| |
| public void printP2PublishFeaturesAndBundles(String metadataRepository, String artifactRepository, FileSet[] bundles, FileSet[] features, String siteXML, String siteQualifier, String categoryDefintion, String categoryVersion, URI[] contextMetadata) { |
| printTab(); |
| output.print("<eclipse.publish.featuresAndBundles"); //$NON-NLS-1$ |
| if (metadataRepository.equals(artifactRepository)) { |
| printAttribute("repository", metadataRepository, true); //$NON-NLS-1$ |
| } else { |
| printAttribute("metadataRepository", metadataRepository, true); //$NON-NLS-1$ |
| printAttribute("artifactRepository", artifactRepository, true); //$NON-NLS-1$ |
| } |
| printAttribute("site", siteXML, false); //$NON-NLS-1$ |
| printAttribute("category", categoryDefintion, false); //$NON-NLS-1$ |
| printAttribute("siteQualifier", siteQualifier, false); //$NON-NLS-1$ |
| printAttribute("categoryVersion", categoryVersion, false); //$NON-NLS-1$ |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| for (int i = 0; i < features.length; i++) { |
| features[i].printAs("features", this); //$NON-NLS-1$ |
| } |
| for (int i = 0; i < bundles.length; i++) { |
| bundles[i].printAs("bundles", this); //$NON-NLS-1$ |
| } |
| |
| for (int i = 0; contextMetadata != null && i < contextMetadata.length; i++) { |
| printTab(); |
| print("<contextRepository"); //$NON-NLS-1$ |
| printAttribute("metadata", "true", true); //$NON-NLS-1$ //$NON-NLS-2$ |
| printAttribute("location", URIUtil.toUnencodedString(contextMetadata[i]), true); //$NON-NLS-1$ |
| println("/>"); //$NON-NLS-1$ |
| } |
| |
| indent--; |
| printTab(); |
| output.println("</eclipse.publish.featuresAndBundles>"); //$NON-NLS-1$ |
| } |
| |
| public void printParallel(int threadCount, int threadsPerProcessor) { |
| printTab(); |
| output.print("<parallel"); //$NON-NLS-1$ |
| if (threadCount > 0) |
| output.print(" threadCount=\'" + String.valueOf(threadCount) + "\'"); //$NON-NLS-1$ //$NON-NLS-2$ |
| if (threadsPerProcessor > 0) |
| output.print(" threadsPerProcessor=\'" + String.valueOf(threadsPerProcessor) + "\'"); //$NON-NLS-1$ //$NON-NLS-2$ |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| } |
| |
| public void printEndParallel() { |
| indent--; |
| printTab(); |
| output.println("</parallel>"); //$NON-NLS-1$ |
| |
| } |
| |
| public void printJarTask(String jarFile, FileSet[] files, String manifestAttribute) { |
| printTab(); |
| output.print("<jar"); //$NON-NLS-1$ |
| printAttribute("destfile", jarFile, true); //$NON-NLS-1$ |
| printAttribute("manifest", manifestAttribute, false); //$NON-NLS-1$ |
| //printAttribute("filesetmanifest", filesetManifest, false); //$NON-NLS-1$ |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| for (int i = 0; i < files.length; i++) |
| if (files[i] != null) |
| files[i].print(this); |
| indent--; |
| printTab(); |
| output.println("</jar>"); //$NON-NLS-1$ |
| |
| } |
| |
| /** |
| * Print a <code>jar</code> Ant task to this script. This jars together a group of |
| * files into a single file. |
| * |
| * @param jarFile the destination file name |
| * @param basedir the base directory |
| * @param manifestAttribute the manifest file to use |
| */ |
| public void printJarTask(String jarFile, String basedir, String manifestAttribute) { |
| printJarTask(jarFile, basedir, manifestAttribute, null); |
| } |
| |
| /** |
| * Print a <code>jar</code> Ant task to this script. This jars together a group of |
| * files into a single file. |
| * |
| * @param jarFile the destination file name |
| * @param basedir the base directory |
| * @param manifestAttribute the manifest file to use |
| * @param filesetManifest behavior when a Manifest is found in a zipfileset or |
| * zipgroupfileset file is found. Valid values are "skip", "merge", and |
| * "mergewithoutmain". "merge" will merge all of the manifests together, |
| * and merge this into any other specified manifests. "mergewithoutmain" |
| * merges everything but the Main section of the manifests. Default value |
| * is "skip". |
| */ |
| public void printJarTask(String jarFile, String basedir, String manifestAttribute, String filesetManifest) { |
| printTab(); |
| output.print("<jar"); //$NON-NLS-1$ |
| printAttribute("destfile", jarFile, true); //$NON-NLS-1$ |
| printAttribute("basedir", basedir, false); //$NON-NLS-1$ |
| printAttribute("manifest", manifestAttribute, false); //$NON-NLS-1$ |
| printAttribute("filesetmanifest", filesetManifest, false); //$NON-NLS-1$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| public void printJarTask(String jarFile, String baseDir, FileSet[] otherFiles, String manifestAttribute, String filesetManifest, String duplicate) { |
| printTab(); |
| output.print("<jar"); //$NON-NLS-1$ |
| printAttribute("destfile", jarFile, true); //$NON-NLS-1$ |
| printAttribute("basedir", baseDir, true); //$NON-NLS-1$ |
| printAttribute("manifest", manifestAttribute, false); //$NON-NLS-1$ |
| printAttribute("filesetmanifest", filesetManifest, false); //$NON-NLS-1$ |
| printAttribute("duplicate", duplicate, false); //$NON-NLS-1$ |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| for (int i = 0; i < otherFiles.length; i++) |
| if (otherFiles[i] != null) |
| otherFiles[i].print(this); |
| indent--; |
| output.println("</jar>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print the <code>available</code> Ant task to this script. This task sets a property |
| * value if the given file exists at runtime. |
| * |
| * @param property the property to set |
| * @param file the file to look for |
| */ |
| public void printAvailableTask(String property, String file) { |
| printTab(); |
| output.print("<available"); //$NON-NLS-1$ |
| printAttribute("property", property, false); //$NON-NLS-1$ |
| printAttribute("file", file, false); //$NON-NLS-1$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print the <code>available</code> Ant task to this script. This task sets a property |
| * to the given value if the given file exists at runtime. |
| * |
| * @param property the property to set |
| * @param file the file to look for |
| */ |
| public void printAvailableTask(String property, String file, String value) { |
| printTab(); |
| output.print("<available"); //$NON-NLS-1$ |
| printAttribute("property", property, true); //$NON-NLS-1$ |
| printAttribute("file", file, false); //$NON-NLS-1$ |
| printAttribute("value", value, false); //$NON-NLS-1$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print an <code>ant</code> task to this script. This calls Ant on the specified |
| * target contained in the specified Ant file with the given parameters. |
| * |
| * @param antfile the name of the Ant file which contains the target to run |
| * @param dir the basedir for the target |
| * @param target the name of the target |
| * @param outputParam filename to write the output to |
| * @param inheritAll <code>true</code> if the parameters should be passed on |
| * to the ant target |
| * @param properties the table of properties |
| */ |
| public void printAntTask(String antfile, String dir, String target, String outputParam, String inheritAll, Map<String, String> properties) { |
| printAntTask(antfile, dir, target, outputParam, inheritAll, properties, null); |
| } |
| |
| /** |
| * Print an <code>ant</code> task to this script. This calls Ant on the specified |
| * target contained in the specified Ant file with the given parameters. |
| * |
| * @param antfile the name of the Ant file which contains the target to run |
| * @param dir the basedir for the target |
| * @param target the name of the target |
| * @param outputParam filename to write the output to |
| * @param inheritAll <code>true</code> if the parameters should be passed on |
| * to the ant target |
| * @param properties the table of properties |
| * @param references the table of references |
| */ |
| public void printAntTask(String antfile, String dir, String target, String outputParam, String inheritAll, Map<String, String> properties, Map<String, String> references) { |
| printTab(); |
| output.print("<ant"); //$NON-NLS-1$ |
| printAttribute("antfile", antfile, false); //$NON-NLS-1$ |
| printAttribute("dir", dir, false); //$NON-NLS-1$ |
| printAttribute("target", target, false); //$NON-NLS-1$ |
| printAttribute("output", outputParam, false); //$NON-NLS-1$ |
| printAttribute("inheritAll", inheritAll, false); //$NON-NLS-1$ |
| if (properties == null && references == null) |
| output.println("/>"); //$NON-NLS-1$ |
| else { |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| if (properties != null) { |
| Set<Map.Entry<String, String>> entries = properties.entrySet(); |
| for (Iterator<Entry<String, String>> iter = entries.iterator(); iter.hasNext();) { |
| Map.Entry<String, String> entry = iter.next(); |
| printProperty(entry.getKey(), entry.getValue()); |
| } |
| } |
| if (references != null) { |
| Set<Map.Entry<String, String>> entries = references.entrySet(); |
| for (Iterator<Entry<String, String>> iter = entries.iterator(); iter.hasNext();) { |
| Map.Entry<String, String> entry = iter.next(); |
| printTab(); |
| print("<reference refid=\"" + entry.getKey() + "\""); //$NON-NLS-1$ //$NON-NLS-2$ |
| if (entry.getValue() != null) { |
| print(" torefid=\"" + entry.getValue() + "\""); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| print("/>"); //$NON-NLS-1$ |
| println(); |
| } |
| } |
| indent--; |
| printTab(); |
| output.println("</ant>"); //$NON-NLS-1$ |
| } |
| } |
| |
| public void printSubantTask(String antfile, String target, String buildpath, String failOnError, String inheritAll, Map<String, String> properties, Map<String, String> references) { |
| printTab(); |
| output.print("<subant"); //$NON-NLS-1$ |
| printAttribute("antfile", antfile, false); //$NON-NLS-1$ |
| printAttribute("target", target, false); //$NON-NLS-1$ |
| printAttribute("failonerror", failOnError, false); //$NON-NLS-1$ |
| printAttribute("buildpath", buildpath, false); //$NON-NLS-1$ |
| printAttribute("inheritall", inheritAll, false); //$NON-NLS-1$ |
| if (properties == null && references == null) |
| output.println("/>"); //$NON-NLS-1$ |
| else { |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| if (properties != null) { |
| Set<Map.Entry<String, String>> entries = properties.entrySet(); |
| for (Iterator<Entry<String, String>> iter = entries.iterator(); iter.hasNext();) { |
| Map.Entry<String, String> entry = iter.next(); |
| printProperty(entry.getKey(), entry.getValue()); |
| } |
| } |
| if (references != null) { |
| Set<Map.Entry<String, String>> entries = references.entrySet(); |
| for (Iterator<Entry<String, String>> iter = entries.iterator(); iter.hasNext();) { |
| Map.Entry<String, String> entry = iter.next(); |
| printTab(); |
| print("<reference refid=\"" + entry.getKey() + "\""); //$NON-NLS-1$ //$NON-NLS-2$ |
| if (entry.getValue() != null) { |
| print(" torefid=\"" + entry.getValue() + "\""); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| print("/>"); //$NON-NLS-1$ |
| println(); |
| } |
| } |
| indent--; |
| printTab(); |
| output.println("</subant>"); //$NON-NLS-1$ |
| } |
| } |
| |
| /** |
| * Print a <code>zip</code> task to this script. |
| * |
| * @param zipfile the destination file name |
| * @param basedir the source directory to start the zip |
| * @param filesOnly <code>true</code> if the resulting zip file should contain only files and not directories |
| * @param update ndicates whether to update or overwrite the destination file if it already exists |
| * @param fileSets the inclusion/exclusion rules to use when zipping |
| */ |
| public void printZipTask(String zipfile, String basedir, boolean filesOnly, boolean update, FileSet[] fileSets) { |
| printTab(); |
| output.print("<zip"); //$NON-NLS-1$ |
| printAttribute("destfile", zipfile, true); //$NON-NLS-1$ |
| printAttribute("basedir", basedir, false); //$NON-NLS-1$ |
| printAttribute("filesonly", filesOnly ? "true" : "false", true); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| printAttribute("whenempty", "skip", true); //$NON-NLS-1$//$NON-NLS-2$ |
| printAttribute("update", update ? "true" : "false", true); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| if (fileSets == null) |
| output.println("/>"); //$NON-NLS-1$ |
| else { |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| for (int i = 0; i < fileSets.length; i++) |
| if (fileSets[i] != null) |
| fileSets[i].print(this); |
| indent--; |
| printTab(); |
| output.println("</zip>"); //$NON-NLS-1$ |
| } |
| } |
| |
| public void printUnzipTask(String zipFile, String destDir, boolean overWrite, String includePatterns, String excludePatterns) { |
| printTab(); |
| output.print("<unzip"); //$NON-NLS-1$ |
| printAttribute("src", zipFile, true); //$NON-NLS-1$ |
| printAttribute("dest", destDir, true); //$NON-NLS-1$ |
| printAttribute("overwrite", Boolean.toString(overWrite), true); //$NON-NLS-1$ |
| if (includePatterns == null && excludePatterns == null) { |
| output.println("/>"); //$NON-NLS-1$ |
| } else { |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| printTab(); |
| output.print("<patternset"); //$NON-NLS-1$ |
| printAttribute("includes", includePatterns, false); //$NON-NLS-1$ |
| printAttribute("excludes", excludePatterns, false); //$NON-NLS-1$ |
| output.println("/>"); //$NON-NLS-1$ |
| indent--; |
| printTab(); |
| output.println("</unzip>"); //$NON-NLS-1$ |
| } |
| } |
| |
| public void printTarTask(String zipfile, String basedir, boolean filesOnly, boolean update, FileSet[] fileSets) { |
| printTab(); |
| output.print("<tar"); //$NON-NLS-1$ |
| printAttribute("destfile", zipfile, true); //$NON-NLS-1$ |
| printAttribute("basedir", basedir, false); //$NON-NLS-1$ |
| printAttribute("compression", "gzip", true); //$NON-NLS-1$//$NON-NLS-2$ |
| if (fileSets == null) |
| output.println("/>"); //$NON-NLS-1$ |
| else { |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| for (int i = 0; i < fileSets.length; i++) |
| if (fileSets[i] != null) |
| fileSets[i].print(this); |
| indent--; |
| printTab(); |
| output.println("</tar>"); //$NON-NLS-1$ |
| } |
| } |
| |
| /** |
| * Print an <code>arg</code> element to the Ant file. |
| * |
| * @param line |
| */ |
| protected void printArg(String line) { |
| printArg(line, false); |
| } |
| |
| protected void printArg(String line, boolean value) { |
| printTab(); |
| output.print("<arg"); //$NON-NLS-1$ |
| if (value) |
| printAttribute("value", line, false); //$NON-NLS-1$ |
| else |
| printAttribute("line", line, false); //$NON-NLS-1$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print the given string to the Ant script. |
| * |
| * @param string the string to write to the file |
| */ |
| public void printString(String string) { |
| printTab(); |
| output.println(getEscaped(string)); |
| } |
| |
| /** |
| * Print the given comment to the Ant script. |
| * |
| * @param comment the comment to write out |
| */ |
| @Override |
| public void printComment(String comment) { |
| printTab(); |
| output.print("<!-- "); //$NON-NLS-1$ |
| output.print(getEscaped(comment)); |
| output.println(" -->"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Add the given name/value attribute pair to the script. Do not write the attribute |
| * if the value is <code>null</code> unless a <code>true</code> is specified |
| * indicating that it is mandatory. |
| * |
| * @param name the name of the attribute |
| * @param value the value of the attribute or <code>null</code> |
| * @param mandatory <code>true</code> if the attribute should be printed even |
| * if it is <code>null</code> |
| */ |
| @Override |
| public void printAttribute(String name, String value, boolean mandatory) { |
| if (mandatory && value == null) |
| value = ""; //$NON-NLS-1$ |
| if (value != null) { |
| output.print(" "); //$NON-NLS-1$ |
| output.print(getEscaped(name)); |
| output.print("="); //$NON-NLS-1$ |
| printQuotes(value); |
| } |
| } |
| |
| /** |
| * Print a <code>copy</code> task to the script. The source file is specified |
| * by the <code>file</code> parameter. The destination directory is specified by |
| * the <code>todir</code> parameter. |
| * @param file the source file |
| * @param todir the destination directory |
| * @param fileSets the inclusion/exclusion rules to use when copying |
| * @param overwrite TODO |
| */ |
| public void printCopyTask(String file, String todir, FileSet[] fileSets, boolean failOnError, boolean overwrite) { |
| printTab(); |
| output.print("<copy"); //$NON-NLS-1$ |
| printAttribute("file", file, false); //$NON-NLS-1$ |
| printAttribute("todir", todir, false); //$NON-NLS-1$ |
| printAttribute("failonerror", failOnError ? "true" : "false", true); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| printAttribute("overwrite", overwrite ? "true" : "false", true); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| if (fileSets == null) |
| output.println("/>"); //$NON-NLS-1$ |
| else { |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| for (int i = 0; i < fileSets.length; i++) |
| if (fileSets[i] != null) |
| fileSets[i].print(this); |
| indent--; |
| printTab(); |
| output.println("</copy>"); //$NON-NLS-1$ |
| } |
| } |
| |
| public void printMoveTask(String todir, FileSet[] fileSets, boolean failOnError) { |
| printTab(); |
| output.print("<move"); //$NON-NLS-1$ |
| printAttribute("todir", todir, false); //$NON-NLS-1$ |
| printAttribute("failonerror", failOnError ? "true" : "false", true); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| for (int i = 0; i < fileSets.length; i++) |
| if (fileSets[i] != null) |
| fileSets[i].print(this); |
| indent--; |
| printTab(); |
| output.println("</move>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print a <code>copy</code> tak to the script. The source file is specified by |
| * the <code>file</code> parameter. The destination file is specified by the |
| * <code>toFile</code> parameter. |
| * @param file the source file |
| * @param toFile the destination file |
| */ |
| public void printCopyFileTask(String file, String toFile, boolean overwrite) { |
| printTab(); |
| output.print("<copy"); //$NON-NLS-1$ |
| printAttribute("file", file, false); //$NON-NLS-1$ |
| printAttribute("tofile", toFile, false); //$NON-NLS-1$ |
| printAttribute("overwrite", overwrite ? "true" : null, false); //$NON-NLS-1$ //$NON-NLS-2$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print a <code>delete</code> task to the Ant script. At least one of <code>dir</code> |
| * or <code>file</code> is required unless some <code>fileSets</code> are |
| * present. |
| * |
| * @param dir the name of the directory to delete |
| * @param file the name of the file to delete |
| * @param fileSets the specification for the files to delete |
| */ |
| public void printDeleteTask(String dir, String file, FileSet[] fileSets) { |
| printDeleteTask(dir, file, null, fileSets); |
| } |
| |
| public void printDeleteTask(String dir, String file, String quiet, FileSet[] fileSets) { |
| printTab(); |
| output.print("<delete"); //$NON-NLS-1$ |
| printAttribute("dir", dir, false); //$NON-NLS-1$ |
| printAttribute("file", file, false); //$NON-NLS-1$ |
| printAttribute("quiet", quiet, false); //$NON-NLS-1$ |
| if (fileSets == null) |
| output.println("/>"); //$NON-NLS-1$ |
| else { |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| for (int i = 0; i < fileSets.length; i++) |
| if (fileSets[i] != null) |
| fileSets[i].print(this); |
| indent--; |
| printTab(); |
| output.println("</delete>"); //$NON-NLS-1$ |
| } |
| } |
| |
| /** |
| * Print an <code>exec</code> task to the Ant script. |
| * |
| * @param executable the program to execute |
| * @param dir the working directory for the executable |
| * @param lineArgs the arguments for the executable |
| */ |
| public void printExecTask(String executable, String dir, List<String> lineArgs, String os) { |
| printExecTask(executable, dir, lineArgs, os, false); |
| } |
| |
| /** |
| * Print an <code>exec</code> task to the Ant script. |
| * @param executable |
| * @param dir |
| * @param lineArgs |
| * @param os |
| * @param useValue Use value arguments if there is no space in the arg |
| */ |
| public void printExecTask(String executable, String dir, List<String> lineArgs, String os, boolean useValue) { |
| printTab(); |
| output.print("<exec"); //$NON-NLS-1$ |
| printAttribute("executable", executable, true); //$NON-NLS-1$ |
| printAttribute("dir", dir, false); //$NON-NLS-1$ |
| printAttribute("os", os, false); //$NON-NLS-1$ |
| if (lineArgs == null || lineArgs.size() == 0) |
| output.println("/>"); //$NON-NLS-1$ |
| else { |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| for (int i = 0; i < lineArgs.size(); i++) { |
| String arg = lineArgs.get(i); |
| printArg(arg, useValue && arg.indexOf(' ') == -1); |
| } |
| indent--; |
| printTab(); |
| output.println("</exec>"); //$NON-NLS-1$ |
| } |
| } |
| |
| /** |
| * Print a <code>mkdir</code> task to the Ant script. |
| * |
| * @param dir the name of the directory to create. |
| */ |
| public void printMkdirTask(String dir) { |
| printTab(); |
| output.print("<mkdir"); //$NON-NLS-1$ |
| printAttribute("dir", dir, false); //$NON-NLS-1$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print a <code>brand</code> task to the Ant script. |
| * |
| * @param root the location of the launcher to brand. |
| * @param icons the list of icons to use in the branding |
| * @param name the name of the resultant launcher |
| */ |
| public void printBrandTask(String root, String icons, String name, String os) { |
| printTab(); |
| print("<eclipse.brand"); //$NON-NLS-1$ |
| printAttribute("root", root, true); //$NON-NLS-1$ |
| if (icons != null) |
| printAttribute("icons", icons, true); //$NON-NLS-1$ |
| printAttribute("name", name, true); //$NON-NLS-1$ |
| printAttribute("os", os, true); //$NON-NLS-1$ |
| println("/>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print an <code>echo</code> task to the Ant script. |
| * |
| * @param message the message to echo to the output |
| */ |
| public void printEchoTask(String message) { |
| printEchoTask(null, message); |
| } |
| |
| public void printEchoTask(String file, String message) { |
| printEchoTask(file, message, null); |
| } |
| |
| @Override |
| public void printEchoTask(String file, String message, String level) { |
| printTab(); |
| output.print("<echo"); //$NON-NLS-1$ |
| printAttribute("level", level, false); //$NON-NLS-1$ |
| printAttribute("file", file, false); //$NON-NLS-1$ |
| printAttribute("message", message, true); //$NON-NLS-1$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print a <code>path</code> structure to the Ant Script. |
| * The list of paths are printed using path.toString(), so paths |
| * can be any Object. Commonly String or ClasspathComputer3_0.ClasspathElement |
| * @param tag - tag for the structure, normally path or classpath |
| * @param id - id for this structure |
| * @param paths - list of paths. Paths are printed using path.toString() |
| */ |
| public void printPathStructure(String tag, String id, List<Object> paths) { |
| printTab(); |
| print("<" + getEscaped(tag)); //$NON-NLS-1$ |
| if (id != null) |
| print(" id=\"" + getEscaped(id) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ |
| print(">"); //$NON-NLS-1$ |
| println(); |
| |
| if (paths != null) { |
| indent++; |
| for (Iterator<Object> iter = paths.iterator(); iter.hasNext();) { |
| Object path = iter.next(); |
| printTab(); |
| print("<pathelement"); //$NON-NLS-1$ |
| printAttribute("path", path.toString(), false); //$NON-NLS-1$ |
| print("/>"); //$NON-NLS-1$ |
| println(); |
| } |
| indent--; |
| } |
| printEndTag(tag); |
| } |
| |
| /** |
| * Print a <code>param</code> tag to the Ant script. |
| * |
| * @param name the parameter name |
| * @param value the parameter value |
| */ |
| |
| protected void printParam(String name, String value) { |
| printTab(); |
| output.print("<param"); //$NON-NLS-1$ |
| printAttribute("name", name, true); //$NON-NLS-1$ |
| printAttribute("value", value, true); //$NON-NLS-1$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print a <code>project</code> tag to the Ant script. |
| * |
| * @param name the name of the project |
| * @param target the name of default target |
| * @param basedir the base directory for all the project's path calculations |
| */ |
| public void printProjectDeclaration(String name, String target, String basedir) { |
| output.print("<project"); //$NON-NLS-1$ |
| printAttribute("name", name, false); //$NON-NLS-1$ |
| printAttribute("default", target, true); //$NON-NLS-1$ |
| printAttribute("basedir", basedir, false); //$NON-NLS-1$ |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| } |
| |
| /** |
| * Print a <code>project</code> end tag to the Ant script. |
| */ |
| public void printProjectEnd() { |
| indent--; |
| printEndTag("project"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print a <code>property</code> tag to the Ant script. |
| * |
| * @param name the property name |
| * @param value the property value |
| */ |
| public void printProperty(String name, String value) { |
| printTab(); |
| output.print("<property"); //$NON-NLS-1$ |
| printAttribute("name", name, true); //$NON-NLS-1$ |
| printAttribute("value", value, true); //$NON-NLS-1$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| public void printPropertyRefid(String name, String ref) { |
| printTab(); |
| output.print("<property"); //$NON-NLS-1$ |
| printAttribute("name", name, true); //$NON-NLS-1$ |
| printAttribute("refid", ref, true); //$NON-NLS-1$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print the given string to the Ant script within quotes. |
| * |
| * @param message the string to print |
| */ |
| protected void printQuotes(String message) { |
| output.print("\""); //$NON-NLS-1$ |
| output.print(getEscaped(message)); |
| output.print("\""); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print a start tag in the Ant script for the given element name. |
| * |
| * @param tag the name of the element |
| */ |
| @Override |
| public void printStartTag(String tag) { |
| printTab(); |
| output.print("<"); //$NON-NLS-1$ |
| output.print(tag); |
| output.println(">"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print a start tag in the Ant script for the given element name. |
| * |
| * @param tag the name of the element |
| */ |
| @Override |
| public void printStartTag(String tag, Map<String, String> arguments) { |
| printTab(); |
| output.print("<"); //$NON-NLS-1$ |
| output.print(tag); |
| Set<Map.Entry<String, String>> entries = arguments.entrySet(); |
| for (Iterator<Entry<String, String>> iter = entries.iterator(); iter.hasNext();) { |
| Map.Entry<String, String> entry = iter.next(); |
| printAttribute(entry.getKey(), entry.getValue(), true); |
| } |
| output.println(">"); //$NON-NLS-1$ |
| } |
| |
| @Override |
| public void incrementIdent() { |
| indent++; |
| } |
| |
| @Override |
| public void decrementIdent() { |
| indent--; |
| } |
| |
| /** |
| * Print an element the Ant script for the given name including a closing " />". |
| * |
| * @param tag the name of the element |
| * @param arguments the arguments |
| */ |
| @Override |
| public void printElement(String tag, Map<String, String> arguments) { |
| printTab(); |
| output.print("<"); //$NON-NLS-1$ |
| output.print(tag); |
| if (null != arguments) { |
| Set<Map.Entry<String, String>> entries = arguments.entrySet(); |
| for (Iterator<Entry<String, String>> iter = entries.iterator(); iter.hasNext();) { |
| Map.Entry<String, String> entry = iter.next(); |
| printAttribute(entry.getKey(), entry.getValue(), true); |
| } |
| } |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print an end tag in the Ant script for the given element name. |
| * |
| * @param tag the name of the element |
| */ |
| @Override |
| public void printEndTag(String tag) { |
| printTab(); |
| output.print("</"); //$NON-NLS-1$ |
| output.print(tag); |
| output.println(">"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print the given number of tabs to the Ant script. |
| */ |
| public void printTab() { |
| for (int i = 0; i < indent; i++) |
| output.print("\t"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print the given string to the Ant script followed by a carriage-return. |
| * |
| * @param message the string to print |
| */ |
| @Override |
| public void println(String message) { |
| printTab(); |
| output.println(message); |
| } |
| |
| /** |
| * Print the given string to the Ant script. |
| * |
| * @param message |
| */ |
| @Override |
| public void print(String message) { |
| output.print(message); |
| } |
| |
| /** |
| * Print a carriage-return to the Ant script. |
| */ |
| @Override |
| public void println() { |
| output.println(); |
| } |
| |
| /** |
| * Print the given task to the Ant script. |
| * |
| * @param task the task to print |
| */ |
| public void print(ITask task) { |
| task.print(this); |
| } |
| |
| /** |
| * Print a <code>target</code> tag to the Ant script. |
| * |
| * @param name the name of the target |
| * @param depends a comma separated list of required targets |
| * @param ifClause the name of the property that this target depends on |
| * @param unlessClause the name of the property that this target cannot have |
| * @param description a user-readable description of this target |
| */ |
| @Override |
| public void printTargetDeclaration(String name, String depends, String ifClause, String unlessClause, String description) { |
| printTab(); |
| output.print("<target"); //$NON-NLS-1$ |
| printAttribute("name", name, true); //$NON-NLS-1$ |
| printAttribute("depends", depends, false); //$NON-NLS-1$ |
| printAttribute("if", ifClause, false); //$NON-NLS-1$ |
| printAttribute("unless", unlessClause, false); //$NON-NLS-1$ |
| printAttribute("description", description, false); //$NON-NLS-1$ |
| output.println(">"); //$NON-NLS-1$ |
| indent++; |
| } |
| |
| /** |
| * Print a closing <code>target</code> tag to the script. Indent the specified |
| * number of tabs. |
| */ |
| @Override |
| public void printTargetEnd() { |
| indent--; |
| printEndTag("target"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print a <code>eclipse.refreshLocal</code> task to the script. This task refreshes |
| * the specified resource in the workspace, to the specified depth. |
| * |
| * @param resource the resource to refresh |
| * @param depth one of <code>IResource.DEPTH_ZERO</code>, |
| * <code>IResource.DEPTH_ONE</code>, or <code>IResource.DEPTH_INFINITY</code> |
| */ |
| public void printRefreshLocalTask(String resource, String depth) { |
| printTab(); |
| output.print("<eclipse.refreshLocal"); //$NON-NLS-1$ |
| printAttribute("resource", resource, true); //$NON-NLS-1$ |
| printAttribute("depth", depth, false); //$NON-NLS-1$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| public void printChmod(String dir, String rights, String files) { |
| printTab(); |
| output.print("<chmod perm=\"" + rights + "\" "); //$NON-NLS-1$//$NON-NLS-2$ |
| output.print("dir=\"" + getEscaped(dir) + "\" "); //$NON-NLS-1$//$NON-NLS-2$ |
| output.print("includes=\"" + getEscaped(files) + "\" /> "); //$NON-NLS-1$ //$NON-NLS-2$ |
| output.println(); |
| } |
| |
| public void printGet(String source, String destination, String login, String password, boolean usetimestamp) { |
| printTab(); |
| output.print("<get "); //$NON-NLS-1$ |
| printAttribute("username", login, false); //$NON-NLS-1$ |
| printAttribute("password", password, false); //$NON-NLS-1$ |
| printAttribute("src", source, true); //$NON-NLS-1$ |
| printAttribute("dest", destination, true); //$NON-NLS-1$ |
| printAttribute("usetimestamp", usetimestamp ? "true" : null, false); //$NON-NLS-1$ //$NON-NLS-2$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| public void printGZip(String source, String destination) { |
| printTab(); |
| output.println("<gzip src=\"" + getEscaped(source) + "\" zipfile=\"" + getEscaped(destination) + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| } |
| |
| /** |
| * Print a <code> eclipse.convertTask</code> task to the script. This task convert a file path to |
| * an Eclipse resource or vice-versa. |
| * |
| * @param toConvert the entry to convert |
| * @param propertyName the property where to store the result of the convertion |
| * @param isEclipseResource true if toConvert refers to an eclipse resource. |
| */ |
| public void printConvertPathTask(String toConvert, String propertyName, boolean isEclipseResource) { |
| printTab(); |
| output.print("<eclipse.convertPath"); //$NON-NLS-1$ |
| if (isEclipseResource == false) |
| printAttribute("fileSystemPath", toConvert, true); //$NON-NLS-1$ |
| else |
| printAttribute("resourcePath", toConvert, true); //$NON-NLS-1$ |
| printAttribute("property", propertyName, true); //$NON-NLS-1$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print a <code> dirname </code> task to the script. |
| * @param property |
| * @param file |
| */ |
| public void printDirName(String property, String file) { |
| printTab(); |
| output.print("<dirname"); //$NON-NLS-1$ |
| printAttribute("property", property, true); //$NON-NLS-1$ |
| printAttribute("file", file, true); //$NON-NLS-1$ |
| output.println("/>"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Print a <code>Condition</code> task with isset test to the script |
| * @param property name of the property to set |
| * @param value value to set the property to |
| * @param testProperty name of the property for the isset test |
| */ |
| public void printConditionIsSet(String property, String value, String testProperty) { |
| printConditionIsSet(property, value, testProperty, null); |
| } |
| |
| public void printConditionIsSet(String property, String value, String testProperty, String elseValue) { |
| printConditionStart(property, value, elseValue); |
| printIsSet(testProperty); |
| printEndCondition(); |
| } |
| |
| public void printConditionIsTrue(String property, String value, String testValue) { |
| printConditionStart(property, value, null); |
| printIsTrue(testValue); |
| printEndCondition(); |
| } |
| |
| public void printConditionStart(String property, String value, String elseValue) { |
| printTab(); |
| print("<condition"); //$NON-NLS-1$ |
| printAttribute("property", property, true); //$NON-NLS-1$ |
| printAttribute("value", value, true); //$NON-NLS-1$ |
| printAttribute("else", elseValue, false); //$NON-NLS-1$ |
| println(">"); //$NON-NLS-1$ |
| indent++; |
| } |
| |
| public void printIsSet(String testProperty) { |
| println("<isset property=\"" + testProperty + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| public void printIsTrue(String testValue) { |
| println("<istrue value=\"" + testValue + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| public void printIsFalse(String testValue) { |
| println("<isfalse value=\"" + testValue + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| public void printEndCondition() { |
| indent--; |
| printEndTag("condition"); //$NON-NLS-1$ |
| } |
| |
| @Override |
| public void printMacroDef(String macroName, List<String> attributes) { |
| println("<macrodef name=\"" + macroName + "\">"); //$NON-NLS-1$ //$NON-NLS-2$ |
| indent++; |
| if (null != attributes) |
| for (Iterator<String> iterator = attributes.iterator(); iterator.hasNext();) { |
| String attribute = iterator.next(); |
| println("<attribute name=\"" + attribute + "\" />"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| println("<sequential>"); //$NON-NLS-1$ |
| indent++; |
| } |
| |
| @Override |
| public void printEndMacroDef() { |
| indent--; |
| println("</sequential>"); //$NON-NLS-1$ |
| indent--; |
| println("</macrodef>"); //$NON-NLS-1$ |
| } |
| |
| @Override |
| public void printTabs() { |
| printTab(); |
| } |
| |
| public void printTaskDef(String name, String classname) { |
| printTabs(); |
| output.println("<taskdef name=\"" + name + "\" classname=\"" + classname + "\" />"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| } |
| |
| public static String getEscaped(String s) { |
| StringBuffer result = new StringBuffer(s.length() + 10); |
| for (int i = 0; i < s.length(); ++i) |
| appendEscapedChar(result, s.charAt(i)); |
| return result.toString(); |
| } |
| |
| private static void appendEscapedChar(StringBuffer buffer, char c) { |
| buffer.append(getReplacement(c)); |
| } |
| |
| private static String getReplacement(char c) { |
| // Encode special XML characters into the equivalent character references. |
| // These five are defined by default for all XML documents. |
| switch (c) { |
| case '<' : |
| return "<"; //$NON-NLS-1$ |
| case '>' : |
| return ">"; //$NON-NLS-1$ |
| case '"' : |
| return """; //$NON-NLS-1$ |
| case '\'' : |
| return "'"; //$NON-NLS-1$ |
| case '&' : |
| return "&"; //$NON-NLS-1$ |
| default : |
| return String.valueOf(c); |
| } |
| } |
| } |