📄 diagnostics.java
字号:
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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;import org.apache.tools.ant.util.LoaderUtils;import org.apache.tools.ant.util.FileUtils;import org.apache.tools.ant.util.JAXPUtils;import org.apache.tools.ant.util.ProxySetup;import org.apache.tools.ant.util.JavaEnvUtils;import org.apache.tools.ant.launch.Launcher;import org.xml.sax.XMLReader;import javax.xml.parsers.SAXParserFactory;import javax.xml.parsers.SAXParser;import java.io.File;import java.io.FilenameFilter;import java.io.PrintStream;import java.io.InputStream;import java.io.IOException;import java.io.FileOutputStream;import java.util.Enumeration;import java.util.Properties;import java.util.Calendar;import java.util.TimeZone;import java.lang.reflect.Method;import java.lang.reflect.InvocationTargetException;/** * 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 */public final class Diagnostics { /** * value for which a difference between clock and temp file time triggers * a warning. * {@value} */ private static final int BIG_DRIFT_LIMIT = 10000; /** * How big a test file to write. * {@value} */ private static final int TEST_FILE_SIZE = 32; private static final int KILOBYTE = 1024; private static final int SECONDS_PER_MILLISECOND = 1000; private static final int SECONDS_PER_MINUTE = 60; private static final int MINUTES_PER_HOUR = 60; private static final String TEST_CLASS = "org.apache.tools.ant.taskdefs.optional.Test"; /** * The error text when a security manager blocks access to a property. * {@value} */ protected static final String ERROR_PROPERTY_ACCESS_BLOCKED = "Access to this property blocked by a security manager"; /** utility class */ private Diagnostics() { // hidden constructor } /** * 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() { try { Class.forName(TEST_CLASS); } catch (ClassNotFoundException e) { return false; } return true; } /** * 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(TEST_CLASS); 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) { // ignore ignoreThrowable(e); } } /** * return the list of jar files existing in ANT_HOME/lib * and that must have been picked up by Ant script. * @return the list of jar files existing in ant.home/lib or * <tt>null</tt> if an error occurs. */ public static File[] listLibraries() { String home = System.getProperty(MagicNames.ANT_HOME); if (home == null) { return null; } File libDir = new File(home, "lib"); return listJarFiles(libDir); } /** * get a list of all JAR files in a directory * @param libDir directory * @return array of files (or null for no such directory) */ private static File[] listJarFiles(File libDir) { FilenameFilter filter = new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".jar"); } }; File[] files = libDir.listFiles(filter); 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) { Package pkg = clazz.getPackage(); return pkg.getImplementationVersion(); } /** * what parser are we using. * @return the classname of the parser */ private static String getXmlParserName() { SAXParser saxParser = getSAXParser(); if (saxParser == null) { return "Could not create an XML Parser"; } // check to what is in the classname String saxParserName = saxParser.getClass().getName(); return saxParserName; } /** * Create a JAXP SAXParser * @return parser or null for trouble */ private static SAXParser getSAXParser() { SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); if (saxParserFactory == null) { return null; } SAXParser saxParser = null; try { saxParser = saxParserFactory.newSAXParser(); } catch (Exception e) { // ignore ignoreThrowable(e); } return saxParser; } /** * get the location of the parser * @return path or null for trouble in tracking it down */ private static String getXMLParserLocation() { SAXParser saxParser = getSAXParser(); if (saxParser == null) { return null; } String location = getClassLocation(saxParser.getClass()); return location; } private static String getNamespaceParserName() { try { XMLReader reader = JAXPUtils.getNamespaceXMLReader(); return reader.getClass().getName(); } catch (BuildException e) { //ignore ignoreThrowable(e); return null; } } private static String getNamespaceParserLocation() { try { XMLReader reader = JAXPUtils.getNamespaceXMLReader(); return getClassLocation(reader.getClass()); } catch (BuildException e) { //ignore ignoreThrowable(e); return null; } } /** * ignore exceptions. This is to allow future * implementations to log at a verbose level * @param thrown */ private static void ignoreThrowable(Throwable thrown) { } /** * get the location of a class. Stolen from axis/webapps/happyaxis.jsp * @param clazz * @return the jar file or path where a class was found, or null */ private static String getClassLocation(Class clazz) { File f = LoaderUtils.getClassSource(clazz); return f == null ? null : f.getAbsolutePath(); } /** * 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()); header(out, "Implementation Version"); out.println("core tasks : " + getImplementationVersion(Main.class)); Class optional = null; try { optional = Class.forName(TEST_CLASS); out.println("optional tasks : " + getImplementationVersion(optional)); } catch (ClassNotFoundException e) { ignoreThrowable(e); out.println("optional tasks : not available"); } header(out, "ANT PROPERTIES"); doReportAntProperties(out); header(out, "ANT_HOME/lib jar listing"); doReportAntHomeLibraries(out); header(out, "USER_HOME/.ant/lib jar listing"); doReportUserHomeLibraries(out); header(out, "Tasks availability"); doReportTasksAvailability(out); header(out, "org.apache.env.Which diagnostics"); doReportWhich(out); header(out, "XML Parser information"); doReportParserInfo(out); header(out, "System properties"); doReportSystemProperties(out); header(out, "Temp dir"); doReportTempDir(out); header(out, "Locale information"); doReportLocale(out); header(out, "Proxy information"); doReportProxy(out); out.println(); } private static void header(PrintStream out, String section) { out.println(); out.println("-------------------------------------------"); out.print(" "); out.println(section); out.println("-------------------------------------------"); } /** * Report a listing of system properties existing in the current vm. * @param out the stream to print the properties to.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -