From ba5b2b8d7cecde985cbeea85bc2778e98fdeee27 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Wed, 20 Sep 2000 15:53:31 +0000 Subject: [PATCH] New task . git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268023 13f79535-47bb-0310-9956-ffa450edef68 --- WHATSNEW | 2 +- docs/index.html | 1 + docs/native2ascii.html | 58 +++++ .../tools/ant/taskdefs/defaults.properties | 3 +- .../ant/taskdefs/optional/Native2Ascii.java | 231 ++++++++++++++++++ 5 files changed, 293 insertions(+), 2 deletions(-) create mode 100644 docs/native2ascii.html create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java diff --git a/WHATSNEW b/WHATSNEW index c318b6575..a29d48b28 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -46,7 +46,7 @@ Other changes: -------------- * New tasks: antstructure, cab, execon, fail, ftp, genkey, jlink, -junit, sql, javacc, jjtree, starteam, war, unwar, uptodate. +junit, sql, javacc, jjtree, starteam, war, unwar, uptodate, native2ascii. * New tasks mparse pending documentation. diff --git a/docs/index.html b/docs/index.html index d5cc00acc..1a343effa 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4104,6 +4104,7 @@ it had been located at htdocs/manual/ChangeLog.txt.

  • FTP
  • Jlink
  • JUnit
  • +
  • Native2Ascii
  • NetRexxC
  • RenameExtensions
  • Script
  • diff --git a/docs/native2ascii.html b/docs/native2ascii.html new file mode 100644 index 000000000..e93a7988f --- /dev/null +++ b/docs/native2ascii.html @@ -0,0 +1,58 @@ + +Native2Ascii + +

    Native2Ascii

    + +

    Description:

    + +

    Converts files from native encodings to ascii with escaped Unicode. +A common usage is to convert source files maintained in a native +operating system encoding, to ascii prior to compilation.

    + +

    All matching files in the source directory are converted from a +native encoding to ascii. If no encoding is specified, the default +encoding for the JVM is used. If ext is specified, then output +files are renamed to use it as a new extension. If dest and +src point to the same directory, ext is required.

    + +

    This is a directory based task, and supports includes, includesfile, +excludes, excludesfile, and defaultexcludes along with its specific +attributes.

    + +
    +Attribute Description                              Required
    +-----------------------------------------------------------
    +reverse   Reverse the sense of the conversion,     No
    +          i.e. convert from ascii to native 
    +
    +encoding  The native encoding the files are in     No
    +
    +src       The directory to find files in           No
    +
    +dest      The directory to output file to          Yes
    +
    +ext       File extension to use in renaming        No
    +          output files 
    +
    + +

    Examples

    + +
    +<native2ascii encoding="EUCJIS" src="srcdir" dest="srcdir"
    +   includes="**/*.eucjis" ext=".java" />
    +
    + +

    Converts all files in the directory srcdir ending in eucjis +from the EUCJIS encoding to ascii and renames the to end in +.java.

    + +
    +<native2ascii encoding='EUCJIS" src="native/japanese" dest="src"
    +   includes="**/*.java />
    +
    + +

    Converts all the files ending in .java in the directory native/japanese +to ascii, placing the results in the directory src. The names of +the files remain the same.

    + + \ No newline at end of file diff --git a/src/main/org/apache/tools/ant/taskdefs/defaults.properties b/src/main/org/apache/tools/ant/taskdefs/defaults.properties index f4804c0db..4d0110a36 100644 --- a/src/main/org/apache/tools/ant/taskdefs/defaults.properties +++ b/src/main/org/apache/tools/ant/taskdefs/defaults.properties @@ -32,7 +32,6 @@ filter=org.apache.tools.ant.taskdefs.Filter fixcrlf=org.apache.tools.ant.taskdefs.FixCRLF rename=org.apache.tools.ant.taskdefs.Rename patch=org.apache.tools.ant.taskdefs.Patch -compileTask=org.apache.tools.ant.taskdefs.CompileTask style=org.apache.tools.ant.taskdefs.XSLTProcess touch=org.apache.tools.ant.taskdefs.Touch signjar=org.apache.tools.ant.taskdefs.SignJar @@ -64,6 +63,8 @@ javacc=org.apache.tools.ant.taskdefs.optional.javacc.JavaCC jjtree=org.apache.tools.ant.taskdefs.optional.javacc.JJTree starteam=org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut jlink=org.apache.tools.ant.taskdefs.optional.jlink.JlinkTask +native2ascii=org.apache.tools.ant.taskdefs.optional.Native2Ascii # deprecated ant tasks (kept for back compatibility) javadoc2=org.apache.tools.ant.taskdefs.Javadoc +compileTask=org.apache.tools.ant.taskdefs.CompileTask diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java b/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java new file mode 100644 index 000000000..dd180fc9c --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java @@ -0,0 +1,231 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.tools.ant.taskdefs.optional; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.DirectoryScanner; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.taskdefs.MatchingTask; +import org.apache.tools.ant.types.Commandline; +import org.apache.tools.ant.types.Commandline.Argument; + +import java.io.File; + +/** + * Convert files from native encodings to ascii. + * + * @author Drew Sudell + */ +public class Native2Ascii extends MatchingTask { + + private boolean reverse = false; // convert from ascii back to native + private String encoding = null; // encoding to convert to/from + private File srcDir = null; // Where to find input files + private File destDir = null; // Where to put output files + private String extension = null; // Extension of output files if different + + + /** + * Flag the conversion to run in the reverse sense, + * that is Ascii to Native encoding. + * + * @param reverse True if the conversion is to be reversed, + * otherwise false; + */ + public void setReverse(boolean reverse){ + this.reverse = reverse; + } + + /** + * Set the encoding to translate to/from. + * If unset, the default encoding for the JVM is used. + * + * @param encoding String containing the name of the Native + * encoding to convert from or to. + */ + public void setEncoding(String encoding){ + this.encoding = encoding; + } + + /** + * Set the source directory in which to find files to convert. + * + * @param srcDir Direcrory to find input file in. + */ + public void setSrc(File srcDir){ + this.srcDir = srcDir; + } + + + /** + * Set the destination dirctory to place converted files into. + * + * @param destDir directory to place output file into. + */ + public void setDest(File destDir){ + this.destDir = destDir; + } + + /** + * Set the extension which converted files should have. + * If unset, files will not be renamed. + * + * @param ext File extension to use for converted files. + */ + public void setExt(String ext){ + this.extension = ext; + } + + public void execute() throws BuildException { + + Commandline baseCmd = null; // the common portion of our cmd line + DirectoryScanner scanner = null; // Scanner to find our inputs + String[] files; // list of files to process + + // default srcDir to basedir + if (srcDir == null){ + srcDir = project.resolveFile("."); + } + + // Require destDir + if (destDir == null){ + throw new BuildException("The dest attribute must be set."); + } + + // if src and dest dirs are the same, require the extension + // to be set, so we don't stomp every file. One could still + // include a file with the same extension, but .... + if (srcDir.equals(destDir) && (extension == null)){ + throw new BuildException("The ext attribut must be set if" + + " src and dest dirs are the same."); + } + + scanner = getDirectoryScanner(srcDir); + log("Converting files from " + srcDir + " to " + destDir); + files = scanner.getIncludedFiles(); + for (int i = 0; i < files.length; i++){ + convert(files[i]); + } + } + + /** + * Convert a single file. + * + * @param fileName Name of the file to convert (relative to srcDir). + */ + private void convert(String fileName) throws BuildException { + + Commandline cmd = new Commandline(); // Command line to run + File srcFile; // File to convert + File destFile; // where to put the results + + // Set up the basic args (this could be done once, but + // it's cleaner here) + if (reverse){ + cmd.createArgument().setValue("-reverse"); + } + + if (encoding != null){ + cmd.createArgument().setValue("-encoding"); + cmd.createArgument().setValue(encoding); + } + + // Build the full file names, substuting the extension on the + // destination file if needed. + srcFile = new File(srcDir, fileName); + + if (extension != null){ + destFile + = new File(destDir, + fileName.substring(0, fileName.lastIndexOf('.')) + + extension); + }else{ + destFile = new File(destDir, fileName); + } + + cmd.createArgument().setFile(srcFile); + cmd.createArgument().setFile(destFile); + + // Only process if dest not newer than src + if (! destFile.exists() + || (destFile.lastModified() < srcFile.lastModified())){ + + // Make sure we're not about to clobber something + if (srcFile.equals(destFile)){ + throw new BuildException("file " + srcFile + + " would overwrite its self"); + } + + // Make intermediate directories if needed + // XXX JDK 1.1 dosen't have File.getParentFile, + String parentName = destFile.getParent(); + if (parentName != null){ + File parentFile = new File(parentName); + + if ((! parentFile.exists()) && ( ! parentFile.mkdirs())){ + throw new BuildException("cannot create parent directory " + + parentName); + } + } + + log("converting " + fileName, Project.MSG_VERBOSE); + sun.tools.native2ascii.Main n2a + = new sun.tools.native2ascii.Main(); + if(! n2a.convert(cmd.getArguments())){ + throw new BuildException("conversion failed"); + } + } + } +}