Browse Source

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.


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276749 13f79535-47bb-0310-9956-ffa450edef68
master
Steve Loughran 21 years ago
parent
commit
803fb00df9
3 changed files with 257 additions and 97 deletions
  1. +3
    -3
      src/etc/testcases/taskdefs/optional/WsdlToDotnet.xml
  2. +240
    -85
      src/main/org/apache/tools/ant/taskdefs/optional/dotnet/WsdlToDotnet.java
  3. +14
    -9
      src/testcases/org/apache/tools/ant/taskdefs/optional/WsdlToDotnetTest.java

+ 3
- 3
src/etc/testcases/taskdefs/optional/WsdlToDotnet.xml View File

@@ -190,10 +190,10 @@
</target> </target>




<target name="testParseableErrorsIgnoredWhenFalse" depends="init">
<target name="testideErrorsIgnoredWhenFalse" depends="init">
<wsdltodotnet destFile="${out.csc}" <wsdltodotnet destFile="${out.csc}"
srcFile="${local.wsdl}" srcFile="${local.wsdl}"
parseableErrors="false"
ideErrors="false"
> >
</wsdltodotnet> </wsdltodotnet>
</target> </target>
@@ -222,5 +222,5 @@
url="http://ant.apache.org/xml/AntSchema.xsd"/> url="http://ant.apache.org/xml/AntSchema.xsd"/>
</wsdltodotnet> </wsdltodotnet>
</target> </target>
</project> </project>

+ 240
- 85
src/main/org/apache/tools/ant/taskdefs/optional/dotnet/WsdlToDotnet.java View File

@@ -19,9 +19,12 @@ package org.apache.tools.ant.taskdefs.optional.dotnet;
import java.io.File; import java.io.File;
import java.util.Vector; import java.util.Vector;
import java.util.Iterator; import java.util.Iterator;
import java.net.URL;
import java.net.MalformedURLException;


import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task; 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.taskdefs.condition.Os;
import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.util.FileUtils;


@@ -54,11 +57,6 @@ public class WsdlToDotnet extends Task {
*/ */
private File destFile = null; private File destFile = null;


/**
* url to retrieve
*/
private String url = null;

/** /**
* name of source file * name of source file
*/ */
@@ -89,12 +87,6 @@ public class WsdlToDotnet extends Task {
*/ */
protected String extraOptions = null; 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. * protocol string. Exact value set depends on SOAP stack version.
@@ -103,11 +95,11 @@ public class WsdlToDotnet extends Task {
private String protocol = null; private String protocol = null;


/** /**
* should errors come in a machine parseable format. This
* should errors come in an IDE format. This
* is WSE only. * is WSE only.
* @since Ant 1.7 * @since Ant 1.7
*/ */
private boolean parseableErrors = false;
private boolean ideErrors = false;


/** /**
* filesets of file to compile * filesets of file to compile
@@ -115,6 +107,33 @@ public class WsdlToDotnet extends Task {
*/ */
private Vector schemas = new Vector(); 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 * Name of the file to generate. Required
* @param destFile filename * @param destFile filename
@@ -130,7 +149,7 @@ public class WsdlToDotnet extends Task {
*/ */


public void setUrl(String url) { public void setUrl(String url) {
this.url = url;
wsdl.setUrl(url);
} }


/** /**
@@ -143,7 +162,10 @@ public class WsdlToDotnet extends Task {
.removeLeadingPath(getProject().getBaseDir(), .removeLeadingPath(getProject().getBaseDir(),
new File(srcFileName));; new File(srcFileName));;
} }
//save the string name of the file
this.srcFileName = srcFileName; this.srcFileName = srcFileName;
//and save the file
wsdl.setFile(getProject().resolveFile(srcFileName));
} }


/** /**
@@ -193,27 +215,15 @@ public class WsdlToDotnet extends Task {
this.extraOptions = extraOptions; this.extraOptions = extraOptions;
} }


/**
* 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? * Should errors be machine parseable?
* Optional, default=true * Optional, default=true
* *
* @since Ant 1.7 * @since Ant 1.7
* @param parseableErrors
* @param ideErrors
*/ */
public void setParseableErrors(boolean parseableErrors) {
this.parseableErrors = parseableErrors;
public void setIdeErrors(boolean ideErrors) {
this.ideErrors = ideErrors;
} }


/** /**
@@ -238,6 +248,24 @@ public class WsdlToDotnet extends Task {
schemas.add(source); schemas.add(source);
} }


/**
* 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 * validation code
* @throws BuildException if validation failed * @throws BuildException if validation failed
@@ -245,32 +273,13 @@ public class WsdlToDotnet extends Task {
protected void validate() protected void validate()
throws BuildException { throws BuildException {
if (destFile == null) { if (destFile == null) {
throw new BuildException("destination file must be specified");
throw new BuildException(ERROR_NO_DEST_FILE);
} }
if (destFile.isDirectory()) { if (destFile.isDirectory()) {
throw new BuildException( 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 class WsdlToDotnet extends Task {
*/ */
public void execute() public void execute()
throws BuildException { throws BuildException {
if(compiler==null) {
compiler=Compiler.createDefaultCompiler();
}
validate(); validate();
NetCommand command = new NetCommand(this, "WSDL", "wsdl");
NetCommand command = new NetCommand(this,
"WSDL",
compiler.getCommand());
command.setFailOnError(failOnError); command.setFailOnError(failOnError);
//fill in args //fill in args
compiler.applyExtraArgs(command);
command.addArgument("/nologo"); command.addArgument("/nologo");
command.addArgument("/out:" + destFile); command.addArgument("/out:" + destFile);
command.addArgument("/language:", language); command.addArgument("/language:", language);
@@ -294,7 +309,7 @@ public class WsdlToDotnet extends Task {
if(protocol!=null) { if(protocol!=null) {
command.addArgument("/protocol:"+protocol); command.addArgument("/protocol:"+protocol);
} }
if(parseableErrors) {
if(ideErrors) {
command.addArgument("/parsableErrors"); command.addArgument("/parsableErrors");
} }
command.addArgument(extraOptions); command.addArgument(extraOptions);
@@ -302,40 +317,28 @@ public class WsdlToDotnet extends Task {
//set source and rebuild options //set source and rebuild options
boolean rebuild = true; boolean rebuild = true;
long destLastModified = -1; 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. //add in any extra files.
//this is an error in mono, but we do not warn on it as they may fix that outside //this is an error in mono, but we do not warn on it as they may fix that outside
//the ant build cycle. //the ant build cycle.
Iterator it=schemas.iterator(); Iterator it=schemas.iterator();
while ( it.hasNext() ) { while ( it.hasNext() ) {
Schema schema = (Schema) it.next(); 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()); command.addArgument(schema.evaluate());
} }
//conditionally compile //conditionally compile
@@ -344,6 +347,19 @@ public class WsdlToDotnet extends Task {
} }
} }


/**
* 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 * nested schema class
@@ -352,14 +368,26 @@ public class WsdlToDotnet extends Task {
public static class Schema { public static class Schema {
private File file; private File file;
private String url; 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_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_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_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() { 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) { if(file!=null && url!=null) {
throw new BuildException(ERROR_BOTH_DECLARED); throw new BuildException(ERROR_BOTH_DECLARED);
@@ -375,16 +403,27 @@ public class WsdlToDotnet extends Task {
*/ */
public String evaluate() { public String evaluate() {
validate(); validate();
if(file!=null) {
return file.toString();
} else {
if(url!=null) {
return getUrl(); 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() { public File getFile() {
return file; return file;
} }


/**
* name of a file to use as a source of WSDL or XSD data
* @param file
*/
public void setFile(File file) { public void setFile(File file) {
this.file = file; this.file = file;
} }
@@ -393,10 +432,28 @@ public class WsdlToDotnet extends Task {
return url; return url;
} }


/**
* url of a resource.
* URLs have no timestamp checking, and are not validated
* @param url
*/
public void setUrl(String url) { public void setUrl(String url) {
this.url = 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 the timestamp of a file, or -1 for a url (meaning we do not know its age)
* @return * @return
@@ -408,5 +465,103 @@ public class WsdlToDotnet extends Task {
return -1; 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]);
}
}

}

} }



+ 14
- 9
src/testcases/org/apache/tools/ant/taskdefs/optional/WsdlToDotnetTest.java View File

@@ -30,10 +30,15 @@ import org.apache.tools.ant.taskdefs.optional.dotnet.WsdlToDotnet;
public class WsdlToDotnetTest extends BuildFileTest { public class WsdlToDotnetTest extends BuildFileTest {


/** /**
* Description of the Field
* dir for taskdefs
*/ */
private final static String TASKDEFS_DIR = "src/etc/testcases/taskdefs/optional/"; private final static String TASKDEFS_DIR = "src/etc/testcases/taskdefs/optional/";


/**
* message from exec
*/
private static final String WSDL_FAILED = "WSDL returned:";



/** /**
* Constructor * Constructor
@@ -68,7 +73,7 @@ public class WsdlToDotnetTest extends BuildFileTest {
public void testNoParams() throws Exception { public void testNoParams() throws Exception {
expectBuildExceptionContaining("testNoParams", expectBuildExceptionContaining("testNoParams",
"expected failure", "expected failure",
"destination file must be specified");
WsdlToDotnet.ERROR_NO_DEST_FILE);
} }


/** /**
@@ -77,7 +82,7 @@ public class WsdlToDotnetTest extends BuildFileTest {
public void testNoSrc() throws Exception { public void testNoSrc() throws Exception {
expectBuildExceptionContaining("testNoSrc", expectBuildExceptionContaining("testNoSrc",
"expected failure", "expected failure",
"you must specify either a source file or a URL");
WsdlToDotnet.Schema.ERROR_NONE_DECLARED);
} }


/** /**
@@ -86,7 +91,7 @@ public class WsdlToDotnetTest extends BuildFileTest {
public void testDestIsDir() throws Exception { public void testDestIsDir() throws Exception {
expectBuildExceptionContaining("testDestIsDir", expectBuildExceptionContaining("testDestIsDir",
"expected failure", "expected failure",
"is a directory");
WsdlToDotnet.ERROR_DEST_FILE_IS_DIR);
} }


/** /**
@@ -95,7 +100,7 @@ public class WsdlToDotnetTest extends BuildFileTest {
public void testBothSrc() throws Exception { public void testBothSrc() throws Exception {
expectBuildExceptionContaining("testBothSrc", expectBuildExceptionContaining("testBothSrc",
"expected failure", "expected failure",
"both a source file and a URL");
WsdlToDotnet.Schema.ERROR_BOTH_DECLARED);
} }
/** /**
* A unit test for JUnit * A unit test for JUnit
@@ -103,7 +108,7 @@ public class WsdlToDotnetTest extends BuildFileTest {
public void testSrcIsDir() throws Exception { public void testSrcIsDir() throws Exception {
expectBuildExceptionContaining("testSrcIsDir", expectBuildExceptionContaining("testSrcIsDir",
"expected failure", "expected failure",
"is a directory");
WsdlToDotnet.Schema.ERROR_FILE_IS_DIR);
} }


/** /**
@@ -112,7 +117,7 @@ public class WsdlToDotnetTest extends BuildFileTest {
public void testSrcIsMissing() throws Exception { public void testSrcIsMissing() throws Exception {
expectBuildExceptionContaining("testSrcIsMissing", expectBuildExceptionContaining("testSrcIsMissing",
"expected failure", "expected failure",
"does not exist");
WsdlToDotnet.Schema.ERROR_FILE_NOT_FOUND);
} }


/** /**
@@ -133,7 +138,7 @@ public class WsdlToDotnetTest extends BuildFileTest {
public void testInvalidExtraOps() throws Exception { public void testInvalidExtraOps() throws Exception {
expectBuildExceptionContaining("testInvalidExtraOps", expectBuildExceptionContaining("testInvalidExtraOps",
"expected failure", "expected failure",
"WSDL returned:");
WSDL_FAILED);
} }


/** /**
@@ -154,7 +159,7 @@ public class WsdlToDotnetTest extends BuildFileTest {
public void testInvalidExtraOpsVB() throws Exception { public void testInvalidExtraOpsVB() throws Exception {
expectBuildExceptionContaining("testInvalidExtraOpsVB", expectBuildExceptionContaining("testInvalidExtraOpsVB",
"expected failure", "expected failure",
"WSDL returned:");
WSDL_FAILED);
} }


/** /**


Loading…
Cancel
Save