From 6a45d17a831e12c0a475ed212e6e3cb7f720308e Mon Sep 17 00:00:00 2001 From: jprocter Date: Wed, 28 Apr 2010 10:25:37 +0000 Subject: [PATCH] check class versions --- utils/getJavaVersion.java | 166 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 utils/getJavaVersion.java diff --git a/utils/getJavaVersion.java b/utils/getJavaVersion.java new file mode 100644 index 0000000..4f517a4 --- /dev/null +++ b/utils/getJavaVersion.java @@ -0,0 +1,166 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1) + * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +import java.io.*; +import java.util.*; +import java.util.jar.JarEntry; +import java.util.jar.JarInputStream; + +public class getJavaVersion +{ +/** + * Takes a set of Jars and/or class files as arguments. Reports the java version for the classes + */ + + public static void main(String[] args) throws IOException + { + Hashtable observed=new Hashtable(); + for (int i = 0; i < args.length; i++) + { + checkClassVersion(args[i], observed); + } + printVersions(observed, System.out); + } + public static void printVersions(Hashtable observed, java.io.PrintStream outs) + { + if (observed.size()>0) + { + int space=0; + String key=null; + for (Enumeration keys = observed.keys(); keys.hasMoreElements(); ) { + key = (String) keys.nextElement(); + if (space++>0) + { + outs.print(" "); + } + outs.print(key); + } + outs.print("\n"); + } + } + + private static void checkClassVersion(String filename, Hashtable observed) + throws IOException + { + String version = checkClassVersion(filename); + if (version == null) + { +// System.err.println("Reading "+filename+" as jar:"); + try + { + JarInputStream jis = new JarInputStream(new FileInputStream( + filename)); + JarEntry entry; + Hashtable perjar=new Hashtable(); + while ((entry = jis.getNextJarEntry()) != null) + { + if (entry != null) + { + if (entry.getName().endsWith(".class")) + { + try + { + version = getVersion(new DataInputStream(jis)); + if (version != null) + { + addVersion(version, observed); + addVersion(version, perjar); + } + } catch (Exception e) + { + + } + } + } + } + System.err.println("Jar : "+filename); + printVersions(perjar,System.err); + } catch (Exception e) + { + + } + } + else + { + addVersion(version, observed); + } + } + + private static void addVersion(String version, Hashtable observed) + { + if (version != null) + { +// System.err.println("Version is '"+version+"'"); + int[] vrs = (int[]) observed.get(version); + if (vrs == null) + { + vrs = new int[] + { 0 }; + } + vrs[0]++; + observed.put(version, vrs); + } + } + + private static String checkClassVersion(String filename) + throws IOException + { + DataInputStream in = new DataInputStream(new FileInputStream(filename)); + return getVersion(in); + } + + private static Hashtable versions = null; + + private static String parseVersions(int minor, int major) + { + if (versions == null) + { + versions = new Hashtable(); + versions.put("45.3", "1.0"); + versions.put("45.3", "1.1"); + versions.put("46.0", "1.2"); + versions.put("47.0", "1.3"); + versions.put("48.0", "1.4"); + versions.put("49.0", "1.5"); + versions.put("50.0", "1.6"); + } + String version = (String) versions.get(major + "." + + minor); + if (version == null) + { + // get nearest known version + version = (String) versions.get(major + ".0"); + } +// System.err.println("Version "+version); + return version; + } + + private static String getVersion(DataInputStream in) throws IOException + { + int magic = in.readInt(); + if (magic != 0xcafebabe) + { + return null; + } + int minor = in.readUnsignedShort(); + int major = in.readUnsignedShort(); +// System.err.println("Version "+major+"."+minor); + return parseVersions(minor, major); + } + +} -- 1.7.10.2