peterreilly 2003/11/03 07:45:11 Modified: docs/manual/OptionalTasks Tag: ANT_16_BRANCH jdepend.html src/main/org/apache/tools/ant/taskdefs/optional/jdepend Tag: ANT_16_BRANCH JDependTask.java Added: src/etc/testcases/taskdefs/optional/jdepend Tag: ANT_16_BRANCH jdepend.xml src/testcases/org/apache/tools/ant/taskdefs/optional/jdepend Tag: ANT_16_BRANCH JDependTest.java Log: sync with HEAD Revision Changes Path No revision No revision 1.10.2.2 +6 -0 ant/docs/manual/OptionalTasks/jdepend.html Index: jdepend.html =================================================================== RCS file: /home/cvs/ant/docs/manual/OptionalTasks/jdepend.html,v retrieving revision 1.10.2.1 retrieving revision 1.10.2.2 diff -u -r1.10.2.1 -r1.10.2.2 --- jdepend.html 9 Oct 2003 21:01:12 -0000 1.10.2.1 +++ jdepend.html 3 Nov 2003 15:45:10 -0000 1.10.2.2 @@ -73,6 +73,12 @@ <td ALIGN=CENTER VALIGN=TOP>No</td> </tr> <tr> + <td VALIGN=TOP>includeruntime</td> + <td VALIGN=TOP>Implicitly add the classes required to run jdepend + in forked mode. (Ignored if fork is disabled). Since ant 1.6.</td> + <td ALIGN=CENTER VALIGN=TOP>No, default is "no".</td> + </tr> + <tr> <td VALIGN=TOP>classpathref</td> <td VALIGN=TOP>the classpath to use, given as reference to a PATH defined elsewhere.</td> <td ALIGN=CENTER VALIGN=TOP>No</td> No revision No revision 1.1.2.1 +0 -0 ant/src/etc/testcases/taskdefs/optional/jdepend/jdepend.xml Index: jdepend.xml =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/optional/jdepend/jdepend.xml,v retrieving revision 1.1 retrieving revision 1.1.2.1 diff -u -r1.1 -r1.1.2.1 No revision No revision 1.22.2.2 +197 -71 ant/src/main/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTask.java Index: JDependTask.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTask.java,v retrieving revision 1.22.2.1 retrieving revision 1.22.2.2 diff -u -r1.22.2.1 -r1.22.2.2 --- JDependTask.java 3 Nov 2003 15:23:57 -0000 1.22.2.1 +++ JDependTask.java 3 Nov 2003 15:45:11 -0000 1.22.2.2 @@ -61,6 +61,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.Vector; +import java.util.Enumeration; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; @@ -73,6 +74,7 @@ import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.PatternSet; import org.apache.tools.ant.types.Reference; +import org.apache.tools.ant.util.LoaderUtils; /** * Runs JDepend tests. @@ -90,24 +92,27 @@ //private CommandlineJava commandline = new CommandlineJava(); // required attributes - private Path _sourcesPath; // Deprecated! - private Path _classesPath; // Use this going forward + private Path sourcesPath; // Deprecated! + private Path classesPath; // Use this going forward // optional attributes - private File _outputFile; - private File _dir; - private Path _compileClasspath; - private boolean _haltonerror = false; - private boolean _fork = false; - //private Integer _timeout = null; + private File outputFile; + private File dir; + private Path compileClasspath; + private boolean haltonerror = false; + private boolean fork = false; + private Long timeout = null; - private String _jvm = null; + private String jvm = null; private String format = "text"; private PatternSet defaultPatterns = new PatternSet(); private static Constructor packageFilterC; private static Method setFilter; + private boolean includeRuntime = false; + private Path runtimeClasses = null; + static { try { Class packageFilter = @@ -124,54 +129,83 @@ } } - public JDependTask() { + /** + * If true, + * include jdepend.jar in the forked VM. + * + * @param b include ant run time yes or no + * @since Ant 1.6 + */ + public void setIncluderuntime(boolean b) { + includeRuntime = b; + } + + /** + * Set the timeout value (in milliseconds). + * + * <p>If the operation is running for more than this value, the jdepend + * will be canceled. (works only when in 'fork' mode).</p> + * @param value the maximum time (in milliseconds) allowed before + * declaring the test as 'timed-out' + * @see #setFork(boolean) + */ + public void setTimeout(Long value) { + timeout = value; } - /* - public void setTimeout(Integer value) { - _timeout = value; - } - - public Integer getTimeout() { - return _timeout; - } - */ + /** + * @return the timeout value + */ + public Long getTimeout() { + return timeout; + } /** * The output file name. * - * @param outputFile + * @param outputFile the output file name */ public void setOutputFile(File outputFile) { - _outputFile = outputFile; + this.outputFile = outputFile; } + /** + * @return the output file name + */ public File getOutputFile() { - return _outputFile; + return outputFile; } /** * Whether or not to halt on failure. Default: false. + * @param haltonerror the value to set */ - public void setHaltonerror(boolean value) { - _haltonerror = value; + public void setHaltonerror(boolean haltonerror) { + this.haltonerror = haltonerror; } + /** + * @return the value of the haltonerror attribute + */ public boolean getHaltonerror() { - return _haltonerror; + return haltonerror; } /** * If true, forks into a new JVM. Default: false. * - * @param value <tt>true</tt> if a JVM should be forked, otherwise <tt>false<tt> + * @param value <tt>true</tt> if a JVM should be forked, + * otherwise <tt>false<tt> */ public void setFork(boolean value) { - _fork = value; + fork = value; } + /** + * @return the value of the fork attribute + */ public boolean getFork() { - return _fork; + return fork; } /** @@ -182,47 +216,49 @@ * @see #setFork(boolean) */ public void setJvm(String value) { - _jvm = value; + jvm = value; } /** * Adds a path to source code to analyze. + * @return a source path * @deprecated */ public Path createSourcespath() { - if (_sourcesPath == null) { - _sourcesPath = new Path(getProject()); + if (sourcesPath == null) { + sourcesPath = new Path(getProject()); } - return _sourcesPath.createPath(); + return sourcesPath.createPath(); } /** * Gets the sourcepath. - * + * @return the sources path * @deprecated * */ public Path getSourcespath() { - return _sourcesPath; + return sourcesPath; } /** * Adds a path to class code to analyze. + * @return a classes path */ public Path createClassespath() { - if (_classesPath == null) { - _classesPath = new Path(getProject()); + if (classesPath == null) { + classesPath = new Path(getProject()); } - return _classesPath.createPath(); + return classesPath.createPath(); } /** * Gets the classespath. - * + * @return the classes path */ public Path getClassespath() { - return _classesPath; + return classesPath; } /** @@ -231,42 +267,52 @@ * @see #setFork(boolean) */ public void setDir(File dir) { - _dir = dir; + this.dir = dir; } + /** + * @return the dir attribute + */ public File getDir() { - return _dir; + return dir; } /** * Set the classpath to be used for this compilation. + * @param classpath a class path to be used */ public void setClasspath(Path classpath) { - if (_compileClasspath == null) { - _compileClasspath = classpath; + if (compileClasspath == null) { + compileClasspath = classpath; } else { - _compileClasspath.append(classpath); + compileClasspath.append(classpath); } } - /** Gets the classpath to be used for this compilation. */ + /** + * Gets the classpath to be used for this compilation. + * @return the class path used for compilation + */ public Path getClasspath() { - return _compileClasspath; + return compileClasspath; } /** * Adds a path to the classpath. + * @return a classpath */ public Path createClasspath() { - if (_compileClasspath == null) { - _compileClasspath = new Path(getProject()); + if (compileClasspath == null) { + compileClasspath = new Path(getProject()); } - return _compileClasspath.createPath(); + return compileClasspath.createPath(); } /** * Create a new JVM argument. Ignored if no JVM is forked. - * @return create a new JVM argument so that any argument can be passed to the JVM. + * @param commandline the commandline to create the argument on + * @return create a new JVM argument so that any argument can + * be passed to the JVM. * @see #setFork(boolean) */ public Commandline.Argument createJvmarg(CommandlineJava commandline) { @@ -275,6 +321,7 @@ /** * Adds a reference to a classpath defined elsewhere. + * @param r a classpath reference */ public void setClasspathRef(Reference r) { createClasspath().setRefid(r); @@ -282,11 +329,15 @@ /** * add a name entry on the exclude list + * @return a pattern for the excludes */ public PatternSet.NameEntry createExclude() { return defaultPatterns.createExclude(); } + /** + * @return the excludes patterns + */ public PatternSet getExcludes() { return defaultPatterns; } @@ -294,15 +345,23 @@ /** * The format to write the output in, "xml" or "text". * - * @param ea + * @param ea xml or text */ public void setFormat(FormatAttribute ea) { format = ea.getValue(); } + /** + * A class for the enumerated attribute format, + * values are xml and text. + * @see EnumeratedAttribute + */ public static class FormatAttribute extends EnumeratedAttribute { private String [] formats = new String[]{"xml", "text"}; + /** + * @return the enumerated values + */ public String[] getValues() { return formats; } @@ -317,6 +376,48 @@ */ private static final int ERRORS = 1; + /** + * Search for the given resource and add the directory or archive + * that contains it to the classpath. + * + * <p>Doesn't work for archives in JDK 1.1 as the URL returned by + * getResource doesn't contain the name of the archive.</p> + * + * @param resource resource that one wants to lookup + * @since Ant 1.6 + */ + private void addClasspathEntry(String resource) { + /* + * pre Ant 1.6 this method used to call getClass().getResource + * while Ant 1.6 will call ClassLoader.getResource(). + * + * The difference is that Class.getResource expects a leading + * slash for "absolute" resources and will strip it before + * delegating to ClassLoader.getResource - so we now have to + * emulate Class's behavior. + */ + if (resource.startsWith("/")) { + resource = resource.substring(1); + } else { + resource = "org/apache/tools/ant/taskdefs/optional/jdepend/" + + resource; + } + + File f = LoaderUtils.getResourceSource(getClass().getClassLoader(), + resource); + if (f != null) { + log("Found " + f.getAbsolutePath(), Project.MSG_DEBUG); + runtimeClasses.createPath().setLocation(f); + } else { + log("Couldn\'t find " + resource, Project.MSG_DEBUG); + } + } + + /** + * execute the task + * + * @exception BuildException if an error occurs + */ public void execute() throws BuildException { CommandlineJava commandline = new CommandlineJava(); @@ -328,8 +429,8 @@ commandline.setClassname("jdepend.xmlui.JDepend"); } - if (_jvm != null) { - commandline.setVm(_jvm); + if (jvm != null) { + commandline.setVm(jvm); } if (getSourcespath() == null && getClassespath() == null) { throw new BuildException("Missing classespath required argument"); @@ -342,7 +443,7 @@ // execute the test and get the return code int exitValue = JDependTask.ERRORS; - //boolean wasKilled = false; + boolean wasKilled = false; if (!getFork()) { exitValue = executeInVM(commandline); } else { @@ -350,21 +451,22 @@ exitValue = executeAsForked(commandline, watchdog); // null watchdog means no timeout, you'd better not check with null if (watchdog != null) { - //info will be used in later version do nothing for now - //wasKilled = watchdog.killedProcess(); + wasKilled = watchdog.killedProcess(); } } // if there is an error/failure and that it should halt, stop // everything otherwise just log a statement - boolean errorOccurred = exitValue == JDependTask.ERRORS; + boolean errorOccurred = exitValue == JDependTask.ERRORS || wasKilled; if (errorOccurred) { + String errorMessage = "JDepend FAILED" + + (wasKilled ? " - Timed out" : ""); + if (getHaltonerror()) { - throw new BuildException("JDepend failed", - getLocation()); + throw new BuildException(errorMessage, getLocation()); } else { - log("JDepend FAILED", Project.MSG_ERR); + log(errorMessage, Project.MSG_ERR); } } } @@ -376,6 +478,10 @@ /** * Execute inside VM. + * + * @param commandline the command line + * @return the return value of the mvm + * @exception BuildException if an error occurs */ public int executeInVM(CommandlineJava commandline) throws BuildException { jdepend.textui.JDepend jdepend; @@ -489,13 +595,18 @@ * Execute the task by forking a new JVM. The command will block until * it finishes. To know if the process was destroyed or not, use the * <tt>killedProcess()</tt> method of the watchdog class. + * @param commandline the commandline for forked jvm * @param watchdog the watchdog in charge of cancelling the test if it - * exceeds a certain amount of time. Can be <tt>null</tt>, in this case - * the test could probably hang forever. + * exceeds a certain amount of time. Can be <tt>null</tt>. + * @return the result of running the jdepend + * @throws BuildException in case of error */ // JL: comment extracted from JUnitTask (and slightly modified) public int executeAsForked(CommandlineJava commandline, ExecuteWatchdog watchdog) throws BuildException { + runtimeClasses = new Path(getProject()); + addClasspathEntry("/jdepend/textui/JDepend.class"); + // if not set, auto-create the ClassPath from the project createClasspath(); @@ -506,12 +617,30 @@ createJvmarg(commandline).setValue(getClasspath().toString()); } + if (includeRuntime) { + Vector v = Execute.getProcEnvironment(); + Enumeration e = v.elements(); + while (e.hasMoreElements()) { + String s = (String) e.nextElement(); + if (s.startsWith("CLASSPATH=")) { + commandline.createClasspath(getProject()).createPath() + .append(new Path(getProject(), + s.substring("CLASSPATH=".length() + ))); + } + } + log("Implicitly adding " + runtimeClasses + " to CLASSPATH", + Project.MSG_VERBOSE); + commandline.createClasspath(getProject()).createPath() + .append(runtimeClasses); + } + if (getOutputFile() != null) { // having a space between the file and its path causes commandline // to add quotes around the argument thus making JDepend not taking // it into account. Thus we split it in two commandline.createArgument().setValue("-file"); - commandline.createArgument().setValue(_outputFile.getPath()); + commandline.createArgument().setValue(outputFile.getPath()); // we have to find a cleaner way to put this output } @@ -573,15 +702,12 @@ /** * @return <tt>null</tt> if there is a timeout value, otherwise the * watchdog instance. + * @throws BuildException in case of error */ protected ExecuteWatchdog createWatchdog() throws BuildException { - - return null; - /* - if (getTimeout() == null) { - return null; - } - return new ExecuteWatchdog(getTimeout().intValue()); - */ + if (getTimeout() == null) { + return null; + } + return new ExecuteWatchdog(getTimeout().longValue()); } } No revision No revision 1.1.2.1 +0 -0 ant/src/testcases/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTest.java Index: JDependTest.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTest.java,v retrieving revision 1.1 retrieving revision 1.1.2.1 diff -u -r1.1 -r1.1.2.1
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]