001 package org.maltparser.core.helper;
002
003 import java.io.File;
004 import java.io.IOException;
005 import java.net.URL;
006 import java.net.URLDecoder;
007 import java.util.jar.Attributes;
008 import java.util.jar.JarFile;
009 import java.util.jar.Manifest;
010 import java.util.regex.Pattern;
011
012 import org.maltparser.core.exception.MaltChainedException;
013 import org.maltparser.core.options.OptionManager;
014
015 /**
016 *
017 *
018 * @author Johan Hall
019 */
020 public class SystemInfo {
021 private static SystemInfo uniqueInstance = new SystemInfo();
022 private static String version;
023 private static String buildDate;
024 private static Attributes manifestAttributes;
025 private static File maltJarPath;
026
027 private SystemInfo() {
028 String separator = File.separator;
029 if (separator.equals("\\")) {
030 separator = "\\\\";
031 }
032
033 try {
034 getManifestInfo();
035
036 String maltJarSimpleName = "malt.jar";
037 String maltJarVersionName = (version != null && version.length() > 0) ? "malt-" + version + ".jar" : "";
038 Pattern MALTJAR = Pattern.compile("^.*malt[^" + separator + "]*\\.jar$");
039
040 String[] jarfiles = System.getProperty("java.class.path").split(File.pathSeparator);
041 for (int i = 0; i < jarfiles.length; i++) {
042 if (jarfiles[i].endsWith(maltJarSimpleName) || jarfiles[i].endsWith(maltJarVersionName)) {
043 maltJarPath = new File(new File(jarfiles[i])
044 .getAbsolutePath());
045 }
046 }
047 if (maltJarPath == null || maltJarPath.length() == 0) {
048 for (int i = 0; i < jarfiles.length; i++) {
049 if (MALTJAR.matcher(jarfiles[i]).matches()) {
050 maltJarPath = new File(new File(jarfiles[i])
051 .getAbsolutePath());
052 }
053 }
054 }
055 if (maltJarPath == null || maltJarPath.length() == 0) {
056 String codeBasePath = SystemInfo.class.getProtectionDomain().getCodeSource().getLocation().getPath();
057 if (codeBasePath.endsWith(maltJarSimpleName) || codeBasePath.endsWith(maltJarVersionName)) {
058 maltJarPath = new File(new File(codeBasePath).getAbsolutePath());
059 }
060 if (maltJarPath == null || maltJarPath.length() == 0) {
061 if (MALTJAR.matcher(codeBasePath).matches()) {
062 maltJarPath = new File(new File(codeBasePath).getAbsolutePath());
063 }
064 }
065 }
066 } catch (MaltChainedException e) {
067 if (SystemLogger.logger().isDebugEnabled()) {
068 SystemLogger.logger().debug("", e);
069 } else {
070 SystemLogger.logger().error(e.getMessageChain());
071 }
072 System.exit(1);
073 }
074 }
075
076 /**
077 * Returns a reference to the single instance.
078 */
079 public static SystemInfo instance() {
080 return uniqueInstance;
081 }
082
083 /**
084 * Returns the application header
085 *
086 * @return the application header
087 */
088 public static String header() {
089 StringBuilder sb = new StringBuilder();
090 sb
091 .append("-----------------------------------------------------------------------------\n"
092 + " MaltParser "+ version + " \n"
093 + "-----------------------------------------------------------------------------\n"
094 + " MALT (Models and Algorithms for Language Technology) Group \n"
095 + " Vaxjo University and Uppsala University \n"
096 + " Sweden \n"
097 + "-----------------------------------------------------------------------------\n");
098 return sb.toString();
099 }
100
101 /**
102 * Returns a short version of the help
103 *
104 * @return a short version of the help
105 */
106 public static String shortHelp() {
107 StringBuilder sb = new StringBuilder();
108 sb.append("\n"
109 + "Usage: \n"
110 + " java -jar maltparser-"+version+".jar -f <path to option file> <options>\n"
111 + " java -jar maltparser-"+version+".jar -h for more help and options\n\n"
112 + OptionManager.instance().getOptionDescriptions()
113 .toStringOptionGroup("system")
114 + "Documentation: docs/index.html\n");
115 return sb.toString();
116 }
117
118 /**
119 * Returns a set of attributes present in the jar manifest file
120 *
121 * @return a set of attributes present in the jar manifest file
122 */
123 public static Attributes getManifestAttributes() {
124 return manifestAttributes;
125 }
126
127 /**
128 * Returns the version number as string
129 *
130 * @return the version number as string
131 */
132 public static String getVersion() {
133 return version;
134 }
135
136 /**
137 * Returns the build date
138 *
139 * @return the build date
140 */
141 public static String getBuildDate() {
142 return buildDate;
143 }
144
145 public static File getMaltJarPath() {
146 return maltJarPath;
147 }
148
149 /**
150 * Loads the manifest attributes from the manifest in the jar-file
151 *
152 * @throws MaltChainedException
153 */
154 private void getManifestInfo() throws MaltChainedException {
155 try {
156 URL codeBase = SystemInfo.class.getProtectionDomain()
157 .getCodeSource().getLocation();
158 if (codeBase != null && codeBase.getPath().endsWith(".jar")) {
159 JarFile jarfile = new JarFile(URLDecoder.decode(codeBase
160 .getPath(), java.nio.charset.Charset.defaultCharset()
161 .name()));
162 Manifest manifest = jarfile.getManifest();
163 Attributes manifestAttributes = manifest.getMainAttributes();
164 version = manifestAttributes.getValue("Implementation-Version");
165 buildDate = manifestAttributes.getValue("Build-Date");
166 }
167 } catch (IOException e) {
168 version = "";
169 buildDate = "Not available";
170 e.printStackTrace();
171 }
172 }
173 }