/**
* Copyright (c) 2010 Perforce Software. All rights reserved.
*/
package com.perforce.maven.mojo;
import java.io.InputStream;
import java.net.URL;
import java.util.jar.Attributes;
import java.util.jar.Attributes.Name;
import java.util.jar.Manifest;
/**
* Prints information from the JAR file's manifest.
*/
public class Metadata {
/**
* Public main method, used solely for allowing customers to
* print version and other metadata information from the enclosing
* JAR file's manifest. This information is printed to stdout;
* errors are printed to stderr.
*
* @param args not used.
*/
public static void main(String[] args) {
try {
Manifest manifest = getManifest();
Attributes attr = manifest.getMainAttributes();
System.out.println(attr.getValue(Name.IMPLEMENTATION_TITLE));
StringBuilder version = new StringBuilder(
attr.getValue(Name.IMPLEMENTATION_VERSION));
//String changelist = attr.getValue("Build-Changelist");
//if (changelist != null) {
// version.append('/').append(changelist);
//}
//String type = attr.getValue("Build-Type");
//if (type != null) {
// version.append('/').append(type);
//}
System.out.println(version);
} catch (Exception exception) {
System.err.println(exception.getLocalizedMessage());
}
}
/**
* Get the JAR Manifest associated with this class instance,
* if it exists. The interpretation of the attributes in this
* manifest is not defined here and will depend on how the
* jar was built; for a full list of normal Perforce release build
* attributes, contact support, but in general, most of the normal
* Maven build attributes will probably exist, as will
* Name.IMPLEMENTATION_TITLE and Name.IMPLEMENTATION_VERSION (but
* this is not guaranteed).
*
* @return non-null Manifest object if it exists and is retrievable.
* @throws Exception if the manifest can't be found or retrieved
* for any reason.
*/
public static Manifest getManifest() throws Exception {
String className = Metadata.class.getSimpleName() + ".class";
URL classURL = Metadata.class.getResource(className);
if (classURL == null) {
throw new Exception("Error retrieving class as resource: "
+ className);
}
String classPath = classURL.toString();
if (!classPath.startsWith("jar")) {
throw new Exception("Not running from jar file: " + classPath);
}
int separator = classPath.lastIndexOf('!');
if (separator != -1 && separator + 1 >= classPath.length()) {
throw new Exception("Invalid jar file class path: " + classPath);
}
String manifestPath = classPath.substring(0, separator + 1)
+ "/META-INF/MANIFEST.MF";
InputStream inStream = null;
try {
inStream = new URL(manifestPath).openStream();
return new Manifest(inStream);
} finally {
if (inStream != null) {
inStream.close();
}
}
}
}