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 malt.jar -f <path to option file> <options>\n"
111                                    + "   java -jar malt.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    }