001/*
002 * $HeadURL: file:///opt/dev/not-yet-commons-ssl-SVN-repo/tags/commons-ssl-0.3.17/src/java/org/apache/commons/ssl/Version.java $
003 * $Revision: 130 $
004 * $Date: 2007-11-14 19:24:15 -0800 (Wed, 14 Nov 2007) $
005 *
006 * ====================================================================
007 * Licensed to the Apache Software Foundation (ASF) under one
008 * or more contributor license agreements.  See the NOTICE file
009 * distributed with this work for additional information
010 * regarding copyright ownership.  The ASF licenses this file
011 * to you under the Apache License, Version 2.0 (the
012 * "License"); you may not use this file except in compliance
013 * with the License.  You may obtain a copy of the License at
014 *
015 *   http://www.apache.org/licenses/LICENSE-2.0
016 *
017 * Unless required by applicable law or agreed to in writing,
018 * software distributed under the License is distributed on an
019 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
020 * KIND, either express or implied.  See the License for the
021 * specific language governing permissions and limitations
022 * under the License.
023 * ====================================================================
024 *
025 * This software consists of voluntary contributions made by many
026 * individuals on behalf of the Apache Software Foundation.  For more
027 * information on the Apache Software Foundation, please see
028 * <http://www.apache.org/>.
029 *
030 */
031
032package org.apache.commons.ssl;
033
034import java.io.File;
035import java.io.IOException;
036import java.net.URL;
037import java.text.DateFormat;
038import java.text.SimpleDateFormat;
039import java.util.Date;
040import java.util.Enumeration;
041import java.util.jar.JarEntry;
042import java.util.jar.JarFile;
043
044/**
045 * Extracts tagged version from a subversion $HeadURL: file:///opt/dev/not-yet-commons-ssl-SVN-repo/tags/commons-ssl-0.3.17/src/java/org/apache/commons/ssl/Version.java $ property, and prints it
046 * out nicely on standard out.
047 * <p/>
048 * e.g. If this version came from /tags/commons-ssl-0_3_9/, then Version.java
049 * will print:  "Version: 0.3.9" on standard out.
050 *
051 * @author Credit Union Central of British Columbia
052 * @author <a href="http://www.cucbc.com/">www.cucbc.com</a>
053 * @author <a href="mailto:juliusdavies@cucbc.com">juliusdavies@cucbc.com</a>
054 * @since 14-Nov-2007
055 */
056public class Version {
057    public static final String HEAD_URL = "$HeadURL: file:///opt/dev/not-yet-commons-ssl-SVN-repo/tags/commons-ssl-0.3.17/src/java/org/apache/commons/ssl/Version.java $";
058    public static final String VERSION;
059    public static final String COMPILE_TIME;
060
061    static {
062        // Try to extract a clean version number from svn's HeadURL property:
063        String v = "UNKNOWN";
064        boolean fromBranch = false;
065        int x = HEAD_URL.lastIndexOf("/tags/");
066        if (x >= 0) {
067            int y = HEAD_URL.indexOf("/", x + "/tags/".length());
068            if (y >= 0) {
069                v = HEAD_URL.substring(x + "/tags/".length(), y);
070            }
071            v = v.replace('_', '.');
072            v = v.replace('-', '.');
073        } else if (HEAD_URL.indexOf("/trunk/") >= 0) {
074            v = "trunk";
075        } else if (HEAD_URL.indexOf("/branches/") >= 0) {
076            fromBranch = true;
077            x = HEAD_URL.indexOf("/branches/");
078            int y = HEAD_URL.indexOf("/", x + "/branches/".length());
079            if (y >= 0) {
080                v = HEAD_URL.substring(x + "/branches/".length(), y);
081            }
082            v = v.replace('_', '.');
083            v = v.replace('-', '.');
084        }
085
086        String V = v.toUpperCase();
087        x = V.indexOf("COMMONS.SSL.");
088        if (x >= 0) {
089            v = v.substring(x + "commons.ssl.".length());
090        }
091        VERSION = fromBranch ? "***Branch*** " + v : v;
092
093        // Try to calculate when jar file was compiled:
094        String s;
095        try {
096            s = CompileTime.getCompileTimeString(Version.class);
097        }
098        catch (NoClassDefFoundError e) {
099            s = null;
100        }
101        COMPILE_TIME = s;
102    }
103
104    public static String versionString() {
105        String v;
106        if (COMPILE_TIME != null) {
107            v = CompileTime.formatVersion(VERSION, COMPILE_TIME);
108        } else {
109            v = VERSION;
110        }
111        return "Version: " + v;
112    }
113
114    public static void main(String[] args) {
115        System.out.println(versionString());
116    }
117
118    public String toString() {
119        return versionString();
120    }
121
122
123    /**
124     * Searches through a jar file to the find the most recent timestamp of
125     * all the class files.
126     */
127    private static class CompileTime {
128        private final static String PATTERN = ".jar!";
129        private final static String PREFIX = "file:";
130        private final static String DF_FORMAT = "zzz:yyyy-MM-dd/HH:mm:ss.SSS";
131        private final static DateFormat DF = new SimpleDateFormat(DF_FORMAT);
132
133        public static String getCompileTimeString(Class clazz) {
134            String s = clazz.getName();
135            s = "/" + s.replace('.', '/') + ".class";
136            return getCompileTimeString(s);
137        }
138
139        private static String getCompileTimeString(String resource) {
140            try {
141                Date d = getCompileTime(resource);
142                return d != null ? DF.format(d) : "[unknown]";
143            }
144            catch (IOException ioe) {
145                return ioe.toString();
146            }
147        }
148
149        public static Date getCompileTime(String resource) throws IOException {
150            URL url = CompileTime.class.getResource(resource);
151            if (url != null) {
152                String urlString = url.getFile();
153                String fileLocation;
154                int i = urlString.indexOf(PATTERN);
155                if (i > 0) {
156                    int x = i + PATTERN.length() - 1;
157                    fileLocation = urlString.substring(0, x);
158                    if (fileLocation.startsWith(PREFIX)) {
159                        fileLocation = fileLocation.substring(PREFIX.length());
160                    }
161                    JarFile jf = new JarFile(fileLocation);
162                    long newestTime = 0;
163                    Enumeration entries = jf.entries();
164                    while (entries.hasMoreElements()) {
165                        JarEntry entry = (JarEntry) entries.nextElement();
166                        if (entry.getName().endsWith(".class")) {
167                            newestTime = Math.max(newestTime, entry.getTime());
168                        }
169                    }
170                    if (newestTime > 0) {
171                        return new Date(newestTime);
172                    }
173                } else {
174                    File f = new File(urlString);
175                    try {
176                        return new Date(f.lastModified());
177                    }
178                    catch (Exception e) {
179                        return null;
180                    }
181                }
182            }
183            return null;
184        }
185
186        public static String formatVersion(String version, String compileTime) {
187            StringBuffer buf = new StringBuffer();
188            buf.append(version);
189            buf.append("   Compiled: [");
190            buf.append(compileTime);
191            buf.append("]");
192            return buf.toString();
193        }
194
195    }
196
197}