Index: module-main/src/main/java/org/apache/http/util/VersionInfo.java =================================================================== --- module-main/src/main/java/org/apache/http/util/VersionInfo.java (revision 0) +++ module-main/src/main/java/org/apache/http/util/VersionInfo.java (revision 0) @@ -0,0 +1,362 @@ +/* + * $HeadURL$ + * $Revision$ + * $Date$ + * + * ==================================================================== + * 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. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + +package org.apache.http.util; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.Properties; +import java.util.ArrayList; + + +/** + * Provides access to version information for HTTP components. + * Instances of this class provide version information for a single module + * or informal unit, as explained + * here. + * Static methods are used to extract version information from property + * files that are automatically packaged with HTTP component release JARs. + *
+ * All available version information is provided in strings, where + * the string format is informal and subject to change without notice. + * Version information is provided for debugging output and interpretation + * by humans, not for automated processing in applications. + * + * @author Oleg Kalnichevski + * @author and others + */ +public class VersionInfo { + + /** A string constant for unavailable information. */ + public final static String UNAVAILABLE = "UNAVAILABLE"; + + /** The filename of the version information files. */ + public final static String VERSION_PROPERTY_FILE = "version.properties"; + + // the property names + public final static String PROPERTY_MODULE = "info.module"; + public final static String PROPERTY_RELEASE = "info.release"; + public final static String PROPERTY_TIMESTAMP = "info.timestamp"; + + + /** + * The default list of know modules or informal units. + * Private to prevent modification. Clone before returning! + */ + private final static String[] MODULE_LIST = { + "org.apache.http", // HttpCore (main) + "org.apache.http.nio", // HttpNIO + "org.apache.http.nio.ssl", // HttpNIOSSL + "org.apache.http.conn", // HttpConn + "org.apache.http.auth", // HttpAuth + "org.apache.http.cookie", // HttpCookie + "org.apache.http.client", // HttpClient + }; + + + /** + * The Subversion revision number of this VersionInfo class. + * This information can be used to determine the + * {@link #getDefaultPackages default} package list. + */ + protected final static String SVN_REVISION; + static { + // This tag will be expanded by Subversion when the + // source is checked out for building a release. + // It then holds the revision in which _this_file_ was last changed. + String rev = "$Revision$"; + + if (!rev.startsWith("$Revision:")) + rev = UNAVAILABLE; // failed SVN expansion + else + rev = rev.substring(10, rev.length()-1).trim(); + + SVN_REVISION = rev; + } + + + /** The package that contains the version information. */ + private final String infoPackage; + + /** The module from the version info. */ + private final String infoModule; + + /** The release from the version info. */ + private final String infoRelease; + + /** The timestamp from the version info. */ + private final String infoTimestamp; + + /** The classloader from which the version info was obtained. */ + private final String infoClassloader; + + + /** + * Instantiates version information. + * + * @param pckg the package + * @param module the module, or null + * @param release the release, or null + * @param time the build time, or null + * @param clsldr the class loader, or null + */ + protected VersionInfo(String pckg, String module, + String release, String time, String clsldr) { + if (pckg == null) { + throw new IllegalArgumentException + ("Package identifier must not be null."); + } + + infoPackage = pckg; + infoModule = (module != null) ? module : UNAVAILABLE; + infoRelease = (release != null) ? release : UNAVAILABLE; + infoTimestamp = (time != null) ? time : UNAVAILABLE; + infoClassloader = (clsldr != null) ? clsldr : UNAVAILABLE; + } + + + /** + * Obtains the package name. + * The package name identifies the module or informal unit. + * + * @return the package name, never null + */ + public final String getPackage() { + return infoPackage; + } + + /** + * Obtains the name of the versioned module or informal unit. + * This data is read from the version information for the package. + * + * @return the module name, never null + */ + public final String getModule() { + return infoModule; + } + + /** + * Obtains the release of the versioned module or informal unit. + * This data is read from the version information for the package. + * + * @return the release version, never null + */ + public final String getRelease() { + return infoRelease; + } + + /** + * Obtains the timestamp of the versioned module or informal unit. + * This data is read from the version information for the package. + * + * @return the timestamp, never null + */ + public final String getTimestamp() { + return infoTimestamp; + } + + /** + * Obtains the classloader used to read the version information. + * This is just the toString output of the classloader, + * since the version information should not keep a reference to + * the classloader itself. That could prevent garbage collection. + * + * @return the classloader description, never null + */ + public final String getClassloader() { + return infoClassloader; + } + + + /** + * Provides the version information in human-readable format. + * + * @return a string holding this version information + */ + public String toString() { + StringBuffer sb = new StringBuffer + (20 + SVN_REVISION.length() + infoPackage.length() + + infoModule.length() + infoRelease.length() + + infoTimestamp.length() + infoClassloader.length()); + + sb.append("VersionInfo@") + .append(SVN_REVISION).append('(') + .append(infoPackage).append(':').append(infoModule); + + // If version info is missing, a single "UNAVAILABLE" for the module + // is sufficient. Everything else just clutters the output. + if (!UNAVAILABLE.equals(infoRelease)) + sb.append(':').append(infoRelease); + if (!UNAVAILABLE.equals(infoTimestamp)) + sb.append(':').append(infoTimestamp); + if (!UNAVAILABLE.equals(infoClassloader)) + sb.append(':').append(infoClassloader); + + sb.append(')'); + return sb.toString(); + } + + + /** + * Obtains the default list of packages. + * + * @return array holding the default package names + * for which to load version info + */ + public final static String[] getDefaultPackages() { + return (String[]) MODULE_LIST.clone(); + } + + + /** + * Loads version information for a list of packages. + * + * @param pcks the packages for which to load version info, or + * null for the + * {@link #getDefaultPackages default} packages. + * @param clsldr the classloader to load from, or + * null for the thread context classloader + * + * @return the version information for all packages found + */ + public final static VersionInfo[] loadVersionInfo(String[] pckgs, + ClassLoader clsldr) { + if (pckgs == null) + pckgs = MODULE_LIST; + + ArrayList vil = new ArrayList(pckgs.length); + for (int i=0; inull for the thread context classloader + * + * @return the version information for the argument package, or + * null if not available + */ + public final static VersionInfo loadVersionInfo(final String pckg, + ClassLoader clsldr) { + if (pckg == null) { + throw new IllegalArgumentException + ("Package identifier must not be null."); + } + + if (clsldr == null) + clsldr = Thread.currentThread().getContextClassLoader(); + + Properties vip = null; // version info properties, if available + try { + // org.apache.http becomes + // org/apache/http/version.properties + InputStream is = clsldr.getResourceAsStream + (pckg.replace('.', '/') + "/" + VERSION_PROPERTY_FILE); + if (is != null) { + try { + Properties props = new Properties(); + props.load(is); + vip = props; + } finally { + is.close(); + } + } + } catch (IOException ex) { + // shamelessly munch this exception + } + + VersionInfo result = null; + if (vip != null) + result = fromMap(pckg, vip, clsldr); + + return result; + } + + + /** + * Instantiates version information from properties. + * + * @param pckg the package for the version information + * @param info the map from string keys to string values, + * for example {@link java.util.Properties} + * @param clsldr the classloader, or null + * + * @return the version information + */ + protected final static VersionInfo fromMap(String pckg, Map info, + ClassLoader clsldr) { + if (pckg == null) { + throw new IllegalArgumentException + ("Package identifier must not be null."); + } + + String module = null; + String release = null; + String timestamp = null; + + if (info != null) { + module = (String) info.get(PROPERTY_MODULE); + if ((module != null) && (module.length() < 1)) + module = null; + + release = (String) info.get(PROPERTY_RELEASE); + if ((release != null) && ((release.length() < 1) || + (release.equals("${pom.version}")))) + release = null; + + timestamp = (String) info.get(PROPERTY_TIMESTAMP); + if ((timestamp != null) && + ((timestamp.length() < 1) || + (timestamp.equals("${mvn.timestamp}"))) + ) + timestamp = null; + } // if info + + String clsldrstr = null; + if (clsldr != null) + clsldrstr = clsldr.toString(); + + return new VersionInfo(pckg, module, release, timestamp, clsldrstr); + } + +} // class VersionInfo Property changes on: module-main/src/main/java/org/apache/http/util/VersionInfo.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Date Author Id Revision HeadURL Name: svn:eol-style + native Index: module-main/src/main/resources/org/apache/http/version.properties =================================================================== --- module-main/src/main/resources/org/apache/http/version.properties (revision 0) +++ module-main/src/main/resources/org/apache/http/version.properties (revision 0) @@ -0,0 +1,4 @@ +info.module = HttpCore/main +info.release = ${pom.version} +info.timestamp = ${mvn.timestamp} +# timestamp requires Maven 2.1 Property changes on: module-main/src/main/resources/org/apache/http/version.properties ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Date Author Id Revision HeadURL Name: svn:eol-style + native Index: module-main/src/examples/org/apache/http/examples/PrintVersionInfo.java =================================================================== --- module-main/src/examples/org/apache/http/examples/PrintVersionInfo.java (revision 0) +++ module-main/src/examples/org/apache/http/examples/PrintVersionInfo.java (revision 0) @@ -0,0 +1,80 @@ +/* + * $HeadURL$ + * $Revision$ + * $Date$ + * + * ==================================================================== + * 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. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + +package org.apache.http.examples; + + +import org.apache.http.util.VersionInfo; + + +/** + * Prints version information for debugging purposes. + * This can be used to verify that the correct versions of the + * HttpComponent JARs are picked up from the classpath. + * + * + * + * @version $Revision$ + */ +public class PrintVersionInfo { + + /** + * Prints version information. + * + * @param args command line arguments. Leave empty to print version + * information for the default packages. Otherwise, pass + * a list of packages for which to get version info. + */ + public static void main(String args[]) { + + String[] pckgs = null; + if (args.length > 0) + pckgs = args; + + VersionInfo[] via = VersionInfo.loadVersionInfo(pckgs, null); + System.out.println("version info for thread context classloader:"); + for (int i=0; i + + + src/main/resources + false + + META-INF/* + + + + src/main/resources + true + + **/*.properties + + + org.apache.maven.plugins Index: module-nio/src/main/resources/org/apache/http/nio/version.properties =================================================================== --- module-nio/src/main/resources/org/apache/http/nio/version.properties (revision 0) +++ module-nio/src/main/resources/org/apache/http/nio/version.properties (revision 0) @@ -0,0 +1,4 @@ +info.module = HttpNIO +info.release = ${pom.version} +info.timestamp = ${mvn.timestamp} +# timestamp requires Maven 2.1 Property changes on: module-nio/src/main/resources/org/apache/http/nio/version.properties ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Date Author Id Revision HeadURL Name: svn:eol-style + native Index: module-nio/pom.xml =================================================================== --- module-nio/pom.xml (revision 554583) +++ module-nio/pom.xml (working copy) @@ -81,6 +81,22 @@ + + + src/main/resources + false + + META-INF/* + + + + src/main/resources + true + + **/*.properties + + + org.apache.maven.plugins Index: module-niossl/src/main/resources/org/apache/http/nio/ssl/version.properties =================================================================== --- module-niossl/src/main/resources/org/apache/http/nio/ssl/version.properties (revision 0) +++ module-niossl/src/main/resources/org/apache/http/nio/ssl/version.properties (revision 0) @@ -0,0 +1,4 @@ +info.module = HttpNIOSSL +info.release = ${pom.version} +info.timestamp = ${mvn.timestamp} +# timestamp requires Maven 2.1 Property changes on: module-niossl/src/main/resources/org/apache/http/nio/ssl/version.properties ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Date Author Id Revision HeadURL Name: svn:eol-style + native Index: module-niossl/pom.xml =================================================================== --- module-niossl/pom.xml (revision 554583) +++ module-niossl/pom.xml (working copy) @@ -86,6 +86,22 @@ + + + src/main/resources + false + + META-INF/* + + + + src/main/resources + true + + **/*.properties + + + org.apache.maven.plugins