stevel 2004/08/03 16:24:10
Modified: src/etc/testcases/taskdefs/optional WsdlToDotnet.xml
src/main/org/apache/tools/ant/taskdefs/optional/dotnet
WsdlToDotnet.java
src/testcases/org/apache/tools/ant/taskdefs/optional
WsdlToDotnetTest.java
Log:
These changes will break Stefan's and my work builds, but they are for the
better.
1. pull file/url stuff from the main class into another instance of the
schema class.
2. added a makeURL flag that turns a file ref in a schema into a URL. v.
useful for .net.
3. added a compiler enum and attr that lets you choose compiler. Compilers
are microsoft|mono|microsoft-on-mono.
4. renamed parseableerrors to ideErrors.
5. dependency logic uses filesys granularity.
No tests for the compiler stuff, we need to think about how to do that.
Revision Changes Path
1.10 +3 -3 ant/src/etc/testcases/taskdefs/optional/WsdlToDotnet.xml
Index: WsdlToDotnet.xml
===================================================================
RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/optional/WsdlToDotnet.xml,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- WsdlToDotnet.xml 3 Aug 2004 08:52:06 -0000 1.9
+++ WsdlToDotnet.xml 3 Aug 2004 23:24:09 -0000 1.10
@@ -190,10 +190,10 @@
</target>
- <target name="testParseableErrorsIgnoredWhenFalse" depends="init">
+ <target name="testideErrorsIgnoredWhenFalse" depends="init">
<wsdltodotnet destFile="${out.csc}"
srcFile="${local.wsdl}"
- parseableErrors="false"
+ ideErrors="false"
>
</wsdltodotnet>
</target>
@@ -222,5 +222,5 @@
url="http://ant.apache.org/xml/AntSchema.xsd"/>
</wsdltodotnet>
</target>
-
+
</project>
1.25 +240 -85
ant/src/main/org/apache/tools/ant/taskdefs/optional/dotnet/WsdlToDotnet.java
Index: WsdlToDotnet.java
===================================================================
RCS file:
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/dotnet/WsdlToDotnet.java,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- WsdlToDotnet.java 2 Aug 2004 23:03:22 -0000 1.24
+++ WsdlToDotnet.java 3 Aug 2004 23:24:09 -0000 1.25
@@ -19,9 +19,12 @@
import java.io.File;
import java.util.Vector;
import java.util.Iterator;
+import java.net.URL;
+import java.net.MalformedURLException;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.taskdefs.condition.Os;
import org.apache.tools.ant.util.FileUtils;
@@ -55,11 +58,6 @@
private File destFile = null;
/**
- * url to retrieve
- */
- private String url = null;
-
- /**
* name of source file
*/
private String srcFileName = null;
@@ -89,12 +87,6 @@
*/
protected String extraOptions = null;
- /**
- * mono flag; we ignore the Rotor implementation of the CLR
- * @since Ant 1.7
- */
- private boolean isMono = !Os.isFamily("windows");
-
/**
* protocol string. Exact value set depends on SOAP stack version.
@@ -103,11 +95,11 @@
private String protocol = null;
/**
- * should errors come in a machine parseable format. This
+ * should errors come in an IDE format. This
* is WSE only.
* @since Ant 1.7
*/
- private boolean parseableErrors = false;
+ private boolean ideErrors = false;
/**
* filesets of file to compile
@@ -116,6 +108,33 @@
private Vector schemas = new Vector();
/**
+ * our WSDL file.
+ * @since ant1.7
+ */
+ private Schema wsdl=new Schema();
+
+ /**
+ * compiler
+ * @since ant1.7
+ */
+ private Compiler compiler=null;
+
+ /**
+ * error message: dest file is a directory
+ */
+ public static final String ERROR_DEST_FILE_IS_DIR = "destination file is
a directory";
+
+ /**
+ * error message: no dest file
+ */
+ public static final String ERROR_NO_DEST_FILE = "destination file must
be specified";
+
+ /**
+ * used for timestamp checking
+ */
+ private FileUtils fileutils= FileUtils.newFileUtils();
+
+ /**
* Name of the file to generate. Required
* @param destFile filename
*/
@@ -130,7 +149,7 @@
*/
public void setUrl(String url) {
- this.url = url;
+ wsdl.setUrl(url);
}
/**
@@ -143,7 +162,10 @@
.removeLeadingPath(getProject().getBaseDir(),
new File(srcFileName));;
}
+ //save the string name of the file
this.srcFileName = srcFileName;
+ //and save the file
+ wsdl.setFile(getProject().resolveFile(srcFileName));
}
/**
@@ -194,26 +216,14 @@
}
/**
- * Explicitly override the Mono auto-detection.
- *
- * <p>Defaults to false on Windows and true on any other platform.</p>
- *
- * @since Ant 1.7
- */
- public void setMono(boolean b) {
- isMono = b;
- }
-
-
- /**
* Should errors be machine parseable?
* Optional, default=true
*
* @since Ant 1.7
- * @param parseableErrors
+ * @param ideErrors
*/
- public void setParseableErrors(boolean parseableErrors) {
- this.parseableErrors = parseableErrors;
+ public void setIdeErrors(boolean ideErrors) {
+ this.ideErrors = ideErrors;
}
/**
@@ -239,38 +249,37 @@
}
/**
+ * flag to trigger turning a filename into a file:url
+ * ignored for the mono compiler.
+ * @param b
+ */
+ public void setMakeURL(boolean b) {
+ wsdl.setMakeURL(b);
+ }
+
+ /**
+ * identify the compiler
+ * @since Ant 1.7
+ * @param compiler
+ */
+ public void setCompiler(Compiler compiler) {
+ this.compiler = compiler;
+ }
+
+ /**
* validation code
* @throws BuildException if validation failed
*/
protected void validate()
throws BuildException {
if (destFile == null) {
- throw new BuildException("destination file must be specified");
+ throw new BuildException(ERROR_NO_DEST_FILE);
}
if (destFile.isDirectory()) {
throw new BuildException(
- "destination file is a directory");
- }
- if (url != null && srcFileName != null) {
- throw new BuildException(
- "you can not specify both a source file and a URL");
- }
- if (url == null && srcFileName == null) {
- throw new BuildException(
- "you must specify either a source file or a URL");
+ ERROR_DEST_FILE_IS_DIR);
}
- if (srcFileName != null) {
- File srcFile = getProject().resolveFile(srcFileName);
- if (!srcFile.exists()) {
- throw new BuildException(
- "source file does not exist");
- }
- if (srcFile.isDirectory()) {
- throw new BuildException(
- "source file is a directory");
- }
- }
-
+ wsdl.validate();
}
/**
@@ -280,10 +289,16 @@
*/
public void execute()
throws BuildException {
+ if(compiler==null) {
+ compiler=Compiler.createDefaultCompiler();
+ }
validate();
- NetCommand command = new NetCommand(this, "WSDL", "wsdl");
+ NetCommand command = new NetCommand(this,
+ "WSDL",
+ compiler.getCommand());
command.setFailOnError(failOnError);
//fill in args
+ compiler.applyExtraArgs(command);
command.addArgument("/nologo");
command.addArgument("/out:" + destFile);
command.addArgument("/language:", language);
@@ -294,7 +309,7 @@
if(protocol!=null) {
command.addArgument("/protocol:"+protocol);
}
- if(parseableErrors) {
+ if(ideErrors) {
command.addArgument("/parsableErrors");
}
command.addArgument(extraOptions);
@@ -302,40 +317,28 @@
//set source and rebuild options
boolean rebuild = true;
long destLastModified = -1;
- if (srcFileName != null) {
- File srcFile = getProject().resolveFile(srcFileName);
- if (isMono) {
- // Mono 1.0's wsdl doesn't deal with absolute paths
- command.addArgument(srcFileName);
- } else {
- command.addArgument(srcFile.toString());
- }
- //rebuild unless the dest file is newer than the source file
- if ( destFile.exists() ) {
- destLastModified = destFile.lastModified();
- }
- if (srcFile.exists()
- && srcFile.lastModified() <= destLastModified) {
- rebuild = false;
- }
- } else {
- //no source file? must be a url, which has no dependency
- //handling
- rebuild = true;
- command.addArgument(url);
+
+ //rebuild unless the dest file is newer than the source file
+ if ( destFile.exists() ) {
+ destLastModified = destFile.lastModified();
+ rebuild = isRebuildNeeded(wsdl, destLastModified);
+ }
+ String path;
+ //mark for a rebuild if the dest file is newer
+ path=wsdl.evaluate();
+ if ( !compiler.supportsAbsoluteFiles() ) {
+ // Mono 1.0's wsdl doesn't deal with absolute paths
+ path = srcFileName;
}
+ command.addArgument(path);
//add in any extra files.
//this is an error in mono, but we do not warn on it as they may fix
that outside
//the ant build cycle.
Iterator it=schemas.iterator();
while ( it.hasNext() ) {
Schema schema = (Schema) it.next();
- //get date, mark for a rebuild if we are newer
- long schemaTimestamp;
- schemaTimestamp=schema.getTimestamp();
- if(schemaTimestamp>destLastModified) {
- rebuild=true;
- }
+ //mark for a rebuild if we are newer
+ rebuild |= isRebuildNeeded(schema, destLastModified);
command.addArgument(schema.evaluate());
}
//conditionally compile
@@ -344,6 +347,19 @@
}
}
+ /**
+ * checks for a schema being out of data
+ * @param schema url/file
+ * @param destLastModified timestamp, -1 for no dest
+ * @return true if a rebuild is needed.
+ */
+ private boolean isRebuildNeeded(Schema schema, long destLastModified) {
+ if(destLastModified==-1) {
+ return true;
+ }
+ return !fileutils.isUpToDate(schema.getTimestamp(),
destLastModified);
+ }
+
/**
* nested schema class
@@ -352,14 +368,26 @@
public static class Schema {
private File file;
private String url;
+ private boolean makeURL=false;
+
public static final String ERROR_NONE_DECLARED = "One of file and
url must be set";
public static final String ERROR_BOTH_DECLARED = "Only one of file
or url can be set";
public static final String ERROR_FILE_NOT_FOUND = "Not found: ";
+ public static final String ERROR_FILE_IS_DIR = "File is a directory:
";
+ public static final String ERROR_NO_URL_CONVERT = "Could not URL
convert ";
+ /**
+ * validate the schema
+ */
public void validate() {
- if(file!=null && !file.exists()) {
- throw new
BuildException(ERROR_FILE_NOT_FOUND+file.toString());
+ if(file!=null) {
+ if (!file.exists()) {
+ throw new
BuildException(ERROR_FILE_NOT_FOUND+file.toString());
+ }
+ if ( file.isDirectory() ) {
+ throw new
BuildException(ERROR_FILE_IS_DIR+file.toString());
+ }
}
if(file!=null && url!=null) {
throw new BuildException(ERROR_BOTH_DECLARED);
@@ -375,16 +403,27 @@
*/
public String evaluate() {
validate();
- if(file!=null) {
- return file.toString();
- } else {
+ if(url!=null) {
return getUrl();
}
+ if(makeURL) {
+ try {
+ return file.toURL().toExternalForm();
+ } catch (MalformedURLException e) {
+ throw new BuildException(ERROR_NO_URL_CONVERT+file);
+ }
+ }
+ return file.toString();
}
+
public File getFile() {
return file;
}
+ /**
+ * name of a file to use as a source of WSDL or XSD data
+ * @param file
+ */
public void setFile(File file) {
this.file = file;
}
@@ -393,10 +432,28 @@
return url;
}
+ /**
+ * url of a resource.
+ * URLs have no timestamp checking, and are not validated
+ * @param url
+ */
public void setUrl(String url) {
this.url = url;
}
+ public boolean isMakeURL() {
+ return makeURL;
+ }
+
+ /**
+ * flag to request that a file is turned into an absolute file: URL
+ * before being passed to the WSDL compiler
+ * @param makeURL
+ */
+ public void setMakeURL(boolean makeURL) {
+ this.makeURL = makeURL;
+ }
+
/**
* return the timestamp of a file, or -1 for a url (meaning we do
not know its age)
* @return
@@ -408,5 +465,103 @@
return -1;
}
}
+
+ /**
+ * The enumerated values for our compiler
+ */
+ public static class Compiler extends EnumeratedAttribute {
+
+ public static final String COMPILER_MS = "microsoft";
+ public static final String COMPILER_MONO = "mono";
+ public static final String COMPILER_MS_ON_MONO = "microsoft-on-mono";
+ String[] compilers={
+ COMPILER_MS,
+ COMPILER_MONO,
+ COMPILER_MS_ON_MONO
+ };
+
+ public static final String EXE_WSDL = "wsdl";
+ public static final String EXE_MONO = "mono";
+ /**
+ * programs to run
+ */
+ String[] compilerExecutables = {
+ EXE_WSDL,
+ EXE_WSDL,
+ EXE_MONO
+ };
+
+
+ /**
+ * extra things
+ */
+ String[][] extraCompilerArgs = {
+ {},
+ {},
+ {EXE_WSDL}
+ };
+
+ boolean[] absoluteFiles = {
+ true,
+ false,
+ true
+ };
+
+ /**
+ * This is the only method a subclass needs to implement.
+ *
+ * @return an array holding all possible values of the enumeration.
+ * The order of elements must be fixed so that
<tt>indexOfValue(String)</tt>
+ * always return the same index for the same value.
+ */
+ public String[] getValues() {
+ return compilers;
+ }
+
+ /**
+ * create the default compiler for this platform
+ * @return
+ */
+ public static Compiler createDefaultCompiler() {
+ Compiler c=new Compiler();
+ String compilerName;
+ compilerName= Os.isFamily("windows")?COMPILER_MS:COMPILER_MONO;
+ c.setValue(compilerName);
+ return c;
+ }
+
+ /**
+ * return the command to run
+ * @return
+ */
+ public String getCommand() {
+ return compilerExecutables[getIndex()];
+ }
+
+ /**
+ * return any extra arguments for the compiler
+ * @return
+ */
+ public String[] getExtraArgs() {
+ return extraCompilerArgs[getIndex()];
+ }
+
+ public boolean supportsAbsoluteFiles() {
+ return absoluteFiles[getIndex()];
+ }
+
+ /**
+ * apply any extra arguments of this class
+ * @param command
+ */
+ public void applyExtraArgs(NetCommand command) {
+ String[] args=getExtraArgs();
+ for(int i=0;i<args.length;i++) {
+ command.addArgument(args[i]);
+ }
+ }
+
+ }
+
}
1.10 +14 -9
ant/src/testcases/org/apache/tools/ant/taskdefs/optional/WsdlToDotnetTest.java
Index: WsdlToDotnetTest.java
===================================================================
RCS file:
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/WsdlToDotnetTest.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- WsdlToDotnetTest.java 2 Aug 2004 22:42:20 -0000 1.9
+++ WsdlToDotnetTest.java 3 Aug 2004 23:24:09 -0000 1.10
@@ -30,10 +30,15 @@
public class WsdlToDotnetTest extends BuildFileTest {
/**
- * Description of the Field
+ * dir for taskdefs
*/
private final static String TASKDEFS_DIR =
"src/etc/testcases/taskdefs/optional/";
+ /**
+ * message from exec
+ */
+ private static final String WSDL_FAILED = "WSDL returned:";
+
/**
* Constructor
@@ -68,7 +73,7 @@
public void testNoParams() throws Exception {
expectBuildExceptionContaining("testNoParams",
"expected failure",
- "destination file must be specified");
+ WsdlToDotnet.ERROR_NO_DEST_FILE);
}
/**
@@ -77,7 +82,7 @@
public void testNoSrc() throws Exception {
expectBuildExceptionContaining("testNoSrc",
"expected failure",
- "you must specify either a source file or a URL");
+ WsdlToDotnet.Schema.ERROR_NONE_DECLARED);
}
/**
@@ -86,7 +91,7 @@
public void testDestIsDir() throws Exception {
expectBuildExceptionContaining("testDestIsDir",
"expected failure",
- "is a directory");
+ WsdlToDotnet.ERROR_DEST_FILE_IS_DIR);
}
/**
@@ -95,7 +100,7 @@
public void testBothSrc() throws Exception {
expectBuildExceptionContaining("testBothSrc",
"expected failure",
- "both a source file and a URL");
+ WsdlToDotnet.Schema.ERROR_BOTH_DECLARED);
}
/**
* A unit test for JUnit
@@ -103,7 +108,7 @@
public void testSrcIsDir() throws Exception {
expectBuildExceptionContaining("testSrcIsDir",
"expected failure",
- "is a directory");
+ WsdlToDotnet.Schema.ERROR_FILE_IS_DIR);
}
/**
@@ -112,7 +117,7 @@
public void testSrcIsMissing() throws Exception {
expectBuildExceptionContaining("testSrcIsMissing",
"expected failure",
- "does not exist");
+ WsdlToDotnet.Schema.ERROR_FILE_NOT_FOUND);
}
/**
@@ -133,7 +138,7 @@
public void testInvalidExtraOps() throws Exception {
expectBuildExceptionContaining("testInvalidExtraOps",
"expected failure",
- "WSDL returned:");
+ WSDL_FAILED);
}
/**
@@ -154,7 +159,7 @@
public void testInvalidExtraOpsVB() throws Exception {
expectBuildExceptionContaining("testInvalidExtraOpsVB",
"expected failure",
- "WSDL returned:");
+ WSDL_FAILED);
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]