git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277561 13f79535-47bb-0310-9956-ffa450edef68master
@@ -162,9 +162,8 @@ | |||
Kaffe for example --> | |||
<selector id="needs.sun.tools"> | |||
<or> | |||
<filename name="${optional.package}/Native2Ascii*"/> | |||
<filename name="${optional.package}/Javah*"/> | |||
<filename name="${optional.package}/native2ascii/*"/> | |||
<filename name="${optional.package}/native2ascii/Sun*"/> | |||
</or> | |||
</selector> | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
* Copyright 2000-2004 The Apache Software Foundation | |||
* Copyright 2000-2005 The Apache Software Foundation | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
@@ -22,6 +22,8 @@ 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.taskdefs.optional.native2ascii.Native2AsciiAdapter; | |||
import org.apache.tools.ant.taskdefs.optional.native2ascii.Native2AsciiAdapterFactory; | |||
import org.apache.tools.ant.types.Commandline; | |||
import org.apache.tools.ant.types.Mapper; | |||
import org.apache.tools.ant.util.FileNameMapper; | |||
@@ -54,6 +56,15 @@ public class Native2Ascii extends MatchingTask { | |||
this.reverse = reverse; | |||
} | |||
/** | |||
* The value of the reverse attribute. | |||
* | |||
* @since Ant 1.6.3 | |||
*/ | |||
public boolean getReverse() { | |||
return reverse; | |||
} | |||
/** | |||
* Set the encoding to translate to/from. | |||
* If unset, the default encoding for the JVM is used. | |||
@@ -65,6 +76,15 @@ public class Native2Ascii extends MatchingTask { | |||
this.encoding = encoding; | |||
} | |||
/** | |||
* The value of the reverse attribute. | |||
* | |||
* @since Ant 1.6.3 | |||
*/ | |||
public String getEncoding() { | |||
return encoding; | |||
} | |||
/** | |||
* Set the source directory in which to find files to convert. | |||
* | |||
@@ -181,29 +201,15 @@ public class Native2Ascii extends MatchingTask { | |||
* @param srcName name of the input file. | |||
* @param destName name of the input file. | |||
*/ | |||
private void convert(String srcName, String destName) throws BuildException { | |||
Commandline cmd = new Commandline(); // Command line to run | |||
private void convert(String srcName, String destName) | |||
throws BuildException { | |||
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 | |||
srcFile = new File(srcDir, srcName); | |||
destFile = new File(destDir, destName); | |||
cmd.createArgument().setFile(srcFile); | |||
cmd.createArgument().setFile(destFile); | |||
// Make sure we're not about to clobber something | |||
if (srcFile.equals(destFile)) { | |||
throw new BuildException("file " + srcFile | |||
@@ -223,9 +229,9 @@ public class Native2Ascii extends MatchingTask { | |||
} | |||
log("converting " + srcName, Project.MSG_VERBOSE); | |||
sun.tools.native2ascii.Main n2a | |||
= new sun.tools.native2ascii.Main(); | |||
if (!n2a.convert(cmd.getArguments())) { | |||
Native2AsciiAdapter ad = | |||
Native2AsciiAdapterFactory.getAdapter(null, this); | |||
if (!ad.convert(this, srcFile, destFile)) { | |||
throw new BuildException("conversion failed"); | |||
} | |||
} | |||
@@ -0,0 +1,93 @@ | |||
/* | |||
* Copyright 2005 The Apache Software Foundation | |||
* | |||
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
* | |||
*/ | |||
package org.apache.tools.ant.taskdefs.optional.native2ascii; | |||
import java.io.File; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.ProjectComponent; | |||
import org.apache.tools.ant.taskdefs.optional.Native2Ascii; | |||
import org.apache.tools.ant.types.Commandline; | |||
/** | |||
* encapsulates the handling common to diffent Native2Asciiadapter | |||
* implementations. | |||
* | |||
* @since Ant 1.6.3 | |||
*/ | |||
public abstract class DefaultNative2Ascii implements Native2AsciiAdapter { | |||
public DefaultNative2Ascii() { | |||
} | |||
/** | |||
* Splits the task into setting up the command line switches | |||
* (delegated to {@link #setup setup}), adding the file names | |||
* (delegated to {@link addFiles addFiles}) and running the tool | |||
* (delegated to {@link #run run}). | |||
*/ | |||
public final boolean convert(Native2Ascii args, File srcFile, | |||
File destFile) throws BuildException { | |||
Commandline cmd = new Commandline(); | |||
setup(cmd, args); | |||
addFiles(cmd, args, srcFile, destFile); | |||
return run(cmd, args); | |||
} | |||
/** | |||
* Sets up the initial command line. | |||
* | |||
* <p>only the -encoding argument gets handled here.</p> | |||
* | |||
* @param cmd Command line to add to | |||
* @param args provides the user-setting and access to Ant's | |||
* logging system. | |||
*/ | |||
protected void setup(Commandline cmd, Native2Ascii args) | |||
throws BuildException { | |||
if (args.getEncoding() != null) { | |||
cmd.createArgument().setValue("-encoding"); | |||
cmd.createArgument().setValue(args.getEncoding()); | |||
} | |||
} | |||
/** | |||
* Adds source and dest files to the command line. | |||
* | |||
* <p>This implementation adds them without any leading | |||
* qualifiers, source first.</p> | |||
* | |||
* @param cmd Command line to add to | |||
* @param log provides access to Ant's logging system. | |||
* @param src the source file | |||
* @param dest the destination file | |||
*/ | |||
protected void addFiles(Commandline cmd, ProjectComponent log, File src, | |||
File dest) throws BuildException { | |||
cmd.createArgument().setFile(src); | |||
cmd.createArgument().setFile(dest); | |||
} | |||
/** | |||
* Executes the command. | |||
* | |||
* @param cmd Command line to execute | |||
* @param log provides access to Ant's logging system. | |||
* @return whether execution was successful | |||
*/ | |||
protected abstract boolean run(Commandline cmd, ProjectComponent log) | |||
throws BuildException; | |||
} |
@@ -0,0 +1,54 @@ | |||
/* | |||
* Copyright 2005 The Apache Software Foundation | |||
* | |||
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
* | |||
*/ | |||
package org.apache.tools.ant.taskdefs.optional.native2ascii; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.ProjectComponent; | |||
import org.apache.tools.ant.taskdefs.ExecuteJava; | |||
import org.apache.tools.ant.taskdefs.optional.Native2Ascii; | |||
import org.apache.tools.ant.types.Commandline; | |||
/** | |||
* Adapter to kaffe.tools.native2ascii.Native2Ascii. | |||
* | |||
* @since Ant 1.6.3 | |||
*/ | |||
public final class KaffeNative2Ascii extends DefaultNative2Ascii { | |||
/** | |||
* Identifies this adapter. | |||
*/ | |||
public static final String IMPLEMENTATION_NAME = "kaffe"; | |||
protected void setup(Commandline cmd, Native2Ascii args) | |||
throws BuildException { | |||
if (args.getReverse()) { | |||
throw new BuildException("-reverse is not supported by Kaffe"); | |||
} | |||
super.setup(cmd, args); | |||
} | |||
protected boolean run(Commandline cmd, ProjectComponent log) | |||
throws BuildException { | |||
ExecuteJava ej = new ExecuteJava(); | |||
cmd.setExecutable("kaffe.tools.native2ascii.Native2Ascii"); | |||
ej.setJavaCommand(cmd); | |||
ej.execute(log.getProject()); | |||
// otherwise ExecuteJava has thrown an exception | |||
return true; | |||
} | |||
} |
@@ -14,11 +14,27 @@ | |||
* limitations under the License. | |||
* | |||
*/ | |||
package org.apache.tools.ant.taskdef.optional.native2ascii; | |||
package org.apache.tools.ant.taskdefs.optional.native2ascii; | |||
import java.io.File; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.taskdefs.optional.Native2Ascii; | |||
/** | |||
* Interface for an adapter to a native2ascii implementation. | |||
* | |||
* @since Ant 1.6.3 | |||
*/ | |||
public interface Native2AsciiAdapter { | |||
boolean convert(Native2Ascii args, File srcFile, File destFile); | |||
/** | |||
* Convert the encoding of srcFile writing to destFile. | |||
* | |||
* @param args Task that holds command line arguments and allows | |||
* the implementation to send messages to Ant's logging system | |||
* @param srcFile the source to convert | |||
* @param destFile where to send output to | |||
* @return whether the conversion has been successful. | |||
*/ | |||
boolean convert(Native2Ascii args, File srcFile, File destFile) | |||
throws BuildException; | |||
} |
@@ -0,0 +1,96 @@ | |||
/* | |||
* Copyright 2005 The Apache Software Foundation | |||
* | |||
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
* | |||
*/ | |||
package org.apache.tools.ant.taskdefs.optional.native2ascii; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.ProjectComponent; | |||
import org.apache.tools.ant.util.JavaEnvUtils; | |||
/** | |||
* Creates the Native2AsciiAdapter based on the user choice and | |||
* potentially the VM vendor. | |||
* | |||
* @since Ant 1.6.3 | |||
*/ | |||
public class Native2AsciiAdapterFactory { | |||
/** | |||
* Determines the default choice of adapter based on the VM | |||
* vendor. | |||
* | |||
* @return the default choice of adapter based on the VM | |||
* vendor | |||
*/ | |||
public static String getDefault() { | |||
if (JavaEnvUtils.isKaffe()) { | |||
return KaffeNative2Ascii.IMPLEMENTATION_NAME; | |||
} | |||
return SunNative2Ascii.IMPLEMENTATION_NAME; | |||
} | |||
/** | |||
* Creates the Native2AsciiAdapter based on the user choice and * | |||
* potentially the VM vendor. | |||
* | |||
* @param choice the user choice (if any). | |||
* @param log a ProjectComponent instance used to access Ant's | |||
* logging system. | |||
* @return The adapter to use. | |||
*/ | |||
public static Native2AsciiAdapter getAdapter(String choice, | |||
ProjectComponent log) | |||
throws BuildException { | |||
if ((JavaEnvUtils.isKaffe() && choice == null) | |||
|| KaffeNative2Ascii.IMPLEMENTATION_NAME.equals(choice)) { | |||
return new KaffeNative2Ascii(); | |||
} else if (SunNative2Ascii.IMPLEMENTATION_NAME.equals(choice)) { | |||
return new SunNative2Ascii(); | |||
} else if (choice != null) { | |||
return resolveClassName(choice); | |||
} | |||
// This default has been good enough until Ant 1.6.3, so stick | |||
// with it | |||
return new SunNative2Ascii(); | |||
} | |||
/** | |||
* Tries to resolve the given classname into a native2ascii adapter. | |||
* Throws a fit if it can't. | |||
* | |||
* @param className The fully qualified classname to be created. | |||
* @throws BuildException This is the fit that is thrown if className | |||
* isn't an instance of Native2AsciiAdapter. | |||
*/ | |||
private static Native2AsciiAdapter resolveClassName(String className) | |||
throws BuildException { | |||
try { | |||
Class c = Class.forName(className); | |||
Object o = c.newInstance(); | |||
return (Native2AsciiAdapter) o; | |||
} catch (ClassNotFoundException cnfe) { | |||
throw new BuildException("Can't load " + className, cnfe); | |||
} catch (ClassCastException cce) { | |||
throw new BuildException(className | |||
+ " is not a Native2Ascii adapter", cce); | |||
} catch (Throwable t) { | |||
// for all other possibilities | |||
throw new BuildException(className + " caused an interesting " | |||
+ "exception.", t); | |||
} | |||
} | |||
} |
@@ -0,0 +1,49 @@ | |||
/* | |||
* Copyright 2005 The Apache Software Foundation | |||
* | |||
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
* | |||
*/ | |||
package org.apache.tools.ant.taskdefs.optional.native2ascii; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.ProjectComponent; | |||
import org.apache.tools.ant.taskdefs.optional.Native2Ascii; | |||
import org.apache.tools.ant.types.Commandline; | |||
/** | |||
* Adapter to sun.tools.native2ascii.Main. | |||
* | |||
* @since Ant 1.6.3 | |||
*/ | |||
public final class SunNative2Ascii extends DefaultNative2Ascii { | |||
/** | |||
* Identifies this adapter. | |||
*/ | |||
public static final String IMPLEMENTATION_NAME = "sun"; | |||
protected void setup(Commandline cmd, Native2Ascii args) | |||
throws BuildException { | |||
if (args.getReverse()) { | |||
cmd.createArgument().setValue("-reverse"); | |||
} | |||
super.setup(cmd, args); | |||
} | |||
protected boolean run(Commandline cmd, ProjectComponent log) | |||
throws BuildException { | |||
sun.tools.native2ascii.Main n2a = new sun.tools.native2ascii.Main(); | |||
return n2a.convert(cmd.getArguments()); | |||
} | |||
} |