Another handy diagnostic would be to walk all the classes in both
defaults.properties files and attempt do Class.forName and see if they are
there.
Even if a user has optional.jar does not mean they have a complete one. Any
casual user that attempts to build Ant themselves may not realize that
they've only got a partial build unless they jump through lots of hoops to
get all the necessary dependencies (like I did to get the Starteam SDK,
etc!).
The current incarnation of proposal/xdocs requires a full-build of Ant to
work properly, because as it analyzes the source code, it also asks
IntrospectionHelper for the supported attributes/elements, as well as
constructing EnumeratedAttribute subclasses to call getValues.
Erik
----- Original Message -----
From: <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Wednesday, June 26, 2002 7:14 PM
Subject: cvs commit: jakarta-ant/src/main/org/apache/tools/ant Main.java
Diagnostics.java
> sbailliez 2002/06/26 16:14:31
>
> Modified: src/main/org/apache/tools/ant Tag: ANT_15_BRANCH Main.java
> Diagnostics.java
> Log:
> Adding a diagnostic mode to the Ant command line
> via -diagnostics that will generate a report on
> the console and give some bare information that
> may help in solving problems quickly.
>
> Note that Ant will now break immediately if the
> implementation version of optional.jar
> (if available) and ant.jar do not match exactly.
> (The check will occur for JDK 1.2+ only)
>
> Revision Changes Path
> No revision
>
>
> No revision
>
>
> 1.65.2.5 +4 -1 jakarta-ant/src/main/org/apache/tools/ant/Main.java
>
> Index: Main.java
> ===================================================================
> RCS file:
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/Main.java,v
> retrieving revision 1.65.2.4
> retrieving revision 1.65.2.5
> diff -u -r1.65.2.4 -r1.65.2.5
> --- Main.java 12 Jun 2002 15:31:39 -0000 1.65.2.4
> +++ Main.java 26 Jun 2002 23:14:31 -0000 1.65.2.5
> @@ -176,6 +176,7 @@
> Main m = null;
>
> try {
> + Diagnostics.validateVersion();
> m = new Main(args);
> } catch (Throwable exc) {
> printMessage(exc);
> @@ -263,6 +264,9 @@
> } else if (arg.equals("-version")) {
> printVersion();
> return;
> + } else if (arg.equals("-diagnostics")){
> + Diagnostics.doReport(System.out);
> + return;
> } else if (arg.equals("-quiet") || arg.equals("-q")) {
> msgOutputLevel = Project.MSG_WARN;
> } else if (arg.equals("-verbose") || arg.equals("-v")) {
> @@ -784,7 +788,6 @@
> props.load(in);
> in.close();
>
> - String lSep = System.getProperty("line.separator");
> StringBuffer msg = new StringBuffer();
> msg.append("Apache Ant version ");
> msg.append(props.getProperty("VERSION"));
>
>
>
> 1.1.2.2 +72 -34
jakarta-ant/src/main/org/apache/tools/ant/Attic/Diagnostics.java
>
> Index: Diagnostics.java
> ===================================================================
> RCS file:
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/Attic/Diagnostics.java,v
> retrieving revision 1.1.2.1
> retrieving revision 1.1.2.2
> diff -u -r1.1.2.1 -r1.1.2.2
> --- Diagnostics.java 26 Jun 2002 08:42:05 -0000 1.1.2.1
> +++ Diagnostics.java 26 Jun 2002 23:14:31 -0000 1.1.2.2
> @@ -55,48 +55,59 @@
>
> import java.io.File;
> import java.io.FilenameFilter;
> -import java.io.PrintWriter;
> import java.io.PrintStream;
> import java.util.Enumeration;
> import java.lang.reflect.Method;
> import java.lang.reflect.InvocationTargetException;
>
> +import org.apache.tools.ant.util.JavaEnvUtils;
> +
> /**
> - * A little diagnostic helper that output some information
> - * that may help in support.
> + * A little diagnostic helper that output some information that may
help
> + * in support. It should quickly give correct information about the
> + * jar existing in ant.home/lib and the jar versions...
> *
> * @since Ant 1.5
> * @author <a href="mailto:[EMAIL PROTECTED]">Stephane Bailliez</a>
> */
> -public class Diagnostics {
> +public final class Diagnostics {
> +
> + /** utility class */
> + private Diagnostics(){
> + }
>
> /**
> - * Check if optional tasks are available and if they are
implementation
> - * version identical with core.
> - * @return <tt>true</tt> if optional tasks are available and
implementation
> - * version is correct. <tt>false</tt> if optional tasks are not
available.
> - * @throws BuildException if the implementation version of optional
tasks
> - * does not match the core implementation version.
> + * Check if optional tasks are available. Not that it does not
check
> + * for implementation version. Use <tt>validateVersion()</tt> for
this.
> + * @return <tt>true</tt> if optional tasks are available.
> */
> public static boolean isOptionalAvailable() {
> - Class optional = null;
> try {
> - optional =
Class.forName("org.apache.tools.ant.taskdefs.optional.Test");
> +
Class.forName("org.apache.tools.ant.taskdefs.optional.Test");
> } catch (ClassNotFoundException e){
> return false;
> }
> + return true;
> + }
>
> - Package corePkg = Main.class.getPackage();
> - String coreVersion = corePkg.getImplementationVersion();
> - Package optionalPkg = optional.getPackage();
> - String optionalVersion =
optionalPkg.getImplementationVersion();
> - if (coreVersion == null ||
!coreVersion.equals(optionalVersion) ){
> - throw new BuildException(
> - "Invalid implementation version between Ant core
and Ant optional tasks.\n" +
> - " core : " + corePkg + "\n" +
> - " optional: " + optionalPkg);
> + /**
> + * Check if core and optional implementation version do match.
> + * @throws BuildException if the implementation version of optional
tasks
> + * does not match the core implementation version.
> + */
> + public static void validateVersion() throws BuildException {
> + try {
> + Class optional =
Class.forName("org.apache.tools.ant.taskdefs.optional.Test");
> + String coreVersion = getImplementationVersion(Main.class);
> + String optionalVersion =
getImplementationVersion(optional);
> + if (coreVersion == null ||
!coreVersion.equals(optionalVersion) ){
> + throw new BuildException(
> + "Invalid implementation version between Ant
core and Ant optional tasks.\n" +
> + " core : " + coreVersion + "\n" +
> + " optional: " + optionalVersion);
> + }
> + } catch (ClassNotFoundException e){
> }
> - return true;
> }
>
> /**
> @@ -113,37 +124,64 @@
> return name.endsWith(".jar");
> }
> };
> - return libDir.listFiles(filter);
> + // listFiles is JDK 1.2+ method...
> + String[] filenames = libDir.list(filter);
> + File[] files = new File[filenames.length];
> + for (int i = 0; i < filenames.length; i++){
> + files[i] = new File(libDir, filenames[i]);
> + }
> + return files;
> }
>
> -
> + /**
> + * main entry point for command line
> + * @param args command line arguments.
> + */
> public static void main(String[] args){
> doReport(System.out);
> }
>
>
> /**
> - *
> + * Helper method to get the implementation version.
> + * @param clazz the class to get the information from.
> + * @return null if there is no package or implementation version.
> + * '?.?' for JDK 1.0 or 1.1.
> + */
> + private static String getImplementationVersion(Class clazz){
> + if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_0)
> + || JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)){
> + return "?.?";
> + }
> + Package pkg = clazz.getPackage();
> + if (pkg != null) {
> + return pkg.getImplementationVersion();
> + }
> + return null;
> + }
> +
> + /**
> + * Print a report to the given stream.
> + * @param out the stream to print the report to.
> */
> public static void doReport(PrintStream out){
> out.println("------- Ant diagnostics report -------");
> out.println(Main.getAntVersion());
> out.println();
> out.println("-------------------------------------------");
> - out.println(" Implementation Version");
> + out.println(" Implementation Version (JDK1.2+ only)");
> out.println("-------------------------------------------");
> - out.println(" core tasks : " +
Main.class.getPackage().getImplementationVersion());
> + out.println(" core tasks : " +
getImplementationVersion(Main.class));
>
> + Class optional = null;
> try {
> - Class.forName(
> + optional = Class.forName(
> "org.apache.tools.ant.taskdefs.optional.Test");
> + out.println(" optional tasks : " +
getImplementationVersion(optional));
> } catch (ClassNotFoundException e){
> + out.println(" optional tasks : not available");
> }
>
> - Package optionalPkg =
Package.getPackage("org.apache.tools.ant.taskdefs.optional");
> - out.println(" optional tasks : " +
> - (optionalPkg == null ? "not available":
optionalPkg.getImplementationVersion()) );
> -
> out.println();
> out.println("-------------------------------------------");
> out.println(" ANT_HOME/lib jar listing");
> @@ -162,10 +200,10 @@
> out.println("-------------------------------------------");
> Class which = Class.forName("org.apache.env.Which");
> Method method = which.getMethod("main", new Class[]{
String[].class });
> - method.invoke(null, new String[]{});
> + method.invoke(null, new Object[]{new String[]{}});
> } catch (ClassNotFoundException e) {
> out.println("Not available.");
> - out.println("For detailed XML related diagnostics, get
Which from http://xml.apache.org/commons/");
> + out.println("Download it at
http://xml.apache.org/commons/");
> } catch (InvocationTargetException e) {
> error = e.getTargetException() == null ? e :
e.getTargetException();
> } catch (Exception e) {
>
>
>
>
> --
> To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>
>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>