[jboss-cvs] JBossCache/tests/compat/org/jboss/tools ...
Pavel Tsekov
ptsekov at jboss.org
Sun Dec 24 11:00:16 EST 2006
User: ptsekov
Date: 06/12/24 11:00:16
Added: tests/compat/org/jboss/tools ClassVersionInfo.java
SerialVersionUID.java
Log:
* build.xml: Merge the compat-tests target from the 1.4.0 branch.
* tests/compat/*: Merge org.jboss.tools.SerialVersionUID and
org.jboss.cache.compat.SerialVersionUIDUnitTestCase from the 1.4.0 branch.
Revision Changes Path
1.2 +137 -0 JBossCache/tests/compat/org/jboss/tools/ClassVersionInfo.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: ClassVersionInfo.java
===================================================================
RCS file: ClassVersionInfo.java
diff -N ClassVersionInfo.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ClassVersionInfo.java 24 Dec 2006 16:00:16 -0000 1.2
@@ -0,0 +1,137 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.tools;
+
+import java.io.ObjectStreamClass;
+import java.io.Serializable;
+import java.io.FileInputStream;
+import java.io.ObjectInputStream;
+import java.util.Map;
+
+/**
+ * Encapsulates a class serialVersionUID and codebase.
+ *
+ * @author Scott.Stark at jboss.org
+ * @version $Revision: 1.2 $
+ */
+public class ClassVersionInfo implements Serializable
+{
+ static final long serialVersionUID = 2036506209171911437L;
+
+ /** The named class serialVersionUID as returned by ObjectStreamClass */
+ private long serialVersion;
+ /** The binary class name */
+ private String name;
+ private boolean hasExplicitSerialVersionUID;
+
+ public ClassVersionInfo() {}
+
+ public ClassVersionInfo(String name, ClassLoader loader)
+ throws ClassNotFoundException
+ {
+ this.name = name;
+ Class c = loader.loadClass(name);
+ if( c.isInterface() == false )
+ {
+ ObjectStreamClass osc = ObjectStreamClass.lookup(c);
+ if( osc != null )
+ {
+ serialVersion = osc.getSerialVersionUID();
+ try
+ {
+ c.getDeclaredField("serialVersionUID");
+ hasExplicitSerialVersionUID = true;
+ }
+ catch(NoSuchFieldException e)
+ {
+ hasExplicitSerialVersionUID = false;
+ }
+ }
+ }
+ }
+
+ public long getSerialVersion()
+ {
+ return serialVersion;
+ }
+
+ public void setSerialVersion(long serialVersion)
+ {
+ this.serialVersion = serialVersion;
+ }
+
+ public boolean getHasExplicitSerialVersionUID()
+ {
+ return hasExplicitSerialVersionUID;
+ }
+
+ public void setHasExplicitSerialVersionUID(boolean flag)
+ {
+ hasExplicitSerialVersionUID = flag;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ public String toString()
+ {
+ StringBuffer tmp = new StringBuffer("ClassVersionInfo");
+ tmp.append('{');
+ tmp.append("serialVersion=");
+ tmp.append(serialVersion);
+ tmp.append(", hasExplicitSerialVersionUID=");
+ tmp.append(hasExplicitSerialVersionUID);
+ tmp.append(", name=");
+ tmp.append(name);
+ tmp.append('}');
+ return tmp.toString();
+ }
+
+ /**
+ * Utility main entry point that allows one to load a Map<String,ClassVersionInfo>
+ * from a serialized object file to print a specific ClassVersionInfo
+ *
+ * @param args [0] = map.ser file for serialized object image
+ * [1] = class name of the ClassVersionInfo to print
+ * @throws Exception
+ */
+ public static void main(String[] args)
+ throws Exception
+ {
+ if( args.length != 2 )
+ {
+ throw new IllegalArgumentException("Usage ClassVersionInfo map.ser [-list|cvi_fqn]");
+ }
+ FileInputStream fis = new FileInputStream(args[0]);
+ ObjectInputStream ois = new ObjectInputStream(fis);
+ Map cvis = (Map) ois.readObject();
+ ois.close();
+
+ if( args[1].equals("-list") )
+ {
+ System.out.println(cvis.keySet());
+ System.exit(0);
+ }
+
+ String fqn = args[1];
+ if( cvis.containsKey(fqn) == false )
+ {
+ System.err.println("No entry found for: "+fqn);
+ System.exit(1);
+ }
+ ClassVersionInfo cvi = (ClassVersionInfo) cvis.get(fqn);
+ System.out.println(cvi);
+ System.exit(0);
+ }
+}
1.2 +236 -0 JBossCache/tests/compat/org/jboss/tools/SerialVersionUID.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: SerialVersionUID.java
===================================================================
RCS file: SerialVersionUID.java
diff -N SerialVersionUID.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ SerialVersionUID.java 24 Dec 2006 16:00:16 -0000 1.2
@@ -0,0 +1,236 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.tools;
+
+import java.beans.XMLEncoder;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.ObjectOutputStream;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Enumeration;
+import java.util.TreeMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.LinkedHashSet;
+import java.util.logging.Logger;
+import java.util.logging.Level;
+import java.util.jar.JarFile;
+import java.util.jar.JarEntry;
+import java.net.URLClassLoader;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/** A tool that builds a databaase of serialVersionUIDs for a given set
+ * of classes.
+ *
+ * @author Scott.Stark at jboss.org
+ */
+public class SerialVersionUID
+{
+ static Logger log = Logger.getLogger("SerialVersionUID");
+
+ static LinkedHashSet libdirList = new LinkedHashSet();
+
+ static boolean outputXML = false;
+
+ static void parsePropertyList(String listValue, Set dst)
+ {
+ String elements[] = listValue.split(",");
+
+ for (int i = 0; i < elements.length; i++)
+ {
+ dst.add(elements[i].trim());
+ }
+ }
+
+ public static void processProperties()
+ {
+ Properties fallbackProps = new Properties();
+ // A list of directories to scan for .jar files.
+ fallbackProps.setProperty("libdir.list", "lib");
+ fallbackProps.setProperty("output.xml", "true");
+
+ Properties props = new Properties(fallbackProps);
+ String propName, propValue;
+ for (Enumeration e = fallbackProps.propertyNames(); e.hasMoreElements();)
+ {
+ propName = (String) e.nextElement();
+ propValue = System.getProperty(propName);
+ if (propValue != null)
+ {
+ props.setProperty(propName, propValue);
+ }
+ }
+
+ String tmpStr;
+ tmpStr = props.getProperty("libdir.list");
+ if (tmpStr.length() == 0)
+ {
+ tmpStr = fallbackProps.getProperty("libdir.list");
+ }
+ parsePropertyList(tmpStr, libdirList);
+
+ tmpStr = props.getProperty("output.xml");
+ if (tmpStr.length() == 0)
+ {
+ tmpStr = fallbackProps.getProperty("output.xml");
+ }
+ tmpStr.trim();
+ if (tmpStr == "yes" || tmpStr == "true")
+ {
+ outputXML = true;
+ }
+ }
+
+ static void buildJarSet(File dir, LinkedHashSet jarFiles)
+ throws MalformedURLException
+ {
+ File[] files = dir.listFiles();
+ for(int n = 0; n < files.length; n ++)
+ {
+ File child = files[n];
+ if(child.isDirectory())
+ buildJarSet(child, jarFiles);
+ else if( child.getName().endsWith(".jar") )
+ jarFiles.add(child.toURL());
+ }
+ }
+
+ /**
+ * Build a TreeMap of the class name to ClassVersionInfo
+ * @param jar
+ * @param classVersionMap TreeMap<String, ClassVersionInfo> for serializable
+ * classes
+ * @param cl - the class loader to use
+ * @throws IOException thrown if the jar cannot be opened
+ */
+ static void generateJarSerialVersionUIDs(URL jar, TreeMap classVersionMap,
+ ClassLoader cl, String pkgPrefix) throws IOException
+ {
+ String jarName = jar.getFile();
+ JarFile jf = new JarFile(jarName);
+ Enumeration entries = jf.entries();
+ while( entries.hasMoreElements() )
+ {
+ JarEntry entry = (JarEntry) entries.nextElement();
+ String name = entry.getName();
+ if( name.endsWith(".class") && name.startsWith(pkgPrefix) )
+ {
+ name = name.substring(0, name.length() - 6);
+ String classname = name.replace('/', '.');
+ try
+ {
+ log.fine("Creating ClassVersionInfo for: "+classname);
+ ClassVersionInfo cvi = new ClassVersionInfo(classname, cl);
+ if( cvi.getSerialVersion() != 0 )
+ {
+ ClassVersionInfo prevCVI = (ClassVersionInfo)
+ classVersionMap.put(classname, cvi);
+ if( prevCVI != null )
+ {
+ if( prevCVI.getSerialVersion() != cvi.getSerialVersion() )
+ {
+ log.severe("Found inconsistent classes, "
+ +prevCVI+" != "+cvi+", jar: "+jarName);
+ }
+ }
+ if( cvi.getHasExplicitSerialVersionUID() == false )
+ {
+ log.warning("No explicit serialVersionUID: "+cvi);
+ }
+ }
+ }
+ catch(OutOfMemoryError e)
+ {
+ log.log(Level.SEVERE, "Check the MaxPermSize", e);
+ }
+ catch(Throwable e)
+ {
+ log.log(Level.FINE, "While loading: "+name, e);
+ }
+ }
+ }
+ jf.close();
+ }
+
+ /**
+ * Create a Map<String, ClassVersionInfo> for the dist jars.
+ *
+ * @return Map<String, ClassVersionInfo>
+ * @throws IOException
+ . */
+ public static Map processJars() throws IOException
+ {
+ LinkedHashSet jarFiles = new LinkedHashSet();
+
+ File dir;
+ Iterator libdirIterator = libdirList.iterator();
+ while (libdirIterator.hasNext())
+ {
+ dir = new File((String) libdirIterator.next());
+ buildJarSet(dir, jarFiles);
+ }
+
+ URL[] cp = new URL[jarFiles.size()];
+ jarFiles.toArray(cp);
+ ClassLoader parent = Thread.currentThread().getContextClassLoader();
+ URLClassLoader completeClasspath = new URLClassLoader(cp, parent);
+
+ TreeMap classVersionMap = new TreeMap();
+ Iterator jarIter = jarFiles.iterator();
+ while( jarIter.hasNext() )
+ {
+ URL jar = (URL) jarIter.next();
+ try
+ {
+ generateJarSerialVersionUIDs(jar, classVersionMap, completeClasspath, "");
+ }
+ catch(IOException e)
+ {
+ log.info("Failed to process jar: "+jar);
+ }
+ }
+
+ return classVersionMap;
+ }
+
+ /**
+ * Generate a mapping of the serial version UIDs for the serializable classes
+ * under the dist directory (as specified by the dist.dir property).
+ * @throws Exception
+ */
+ public static void main(String[] args) throws Exception
+ {
+ processProperties();
+
+ Map classVersionMap = processJars();
+ log.info(classVersionMap.size() + " serialVersionUIDs stored into the database");
+
+ FileOutputStream fos = new FileOutputStream("serialuid.ser");
+ if (outputXML == false)
+ {
+ // Write the map out the object file
+ ObjectOutputStream oos = new ObjectOutputStream(fos);
+ oos.writeObject(classVersionMap);
+ oos.close();
+ }
+ else
+ {
+ XMLEncoder xml = new XMLEncoder(fos);
+ Iterator mapIterator = classVersionMap.values().iterator();
+ while (mapIterator.hasNext())
+ {
+ xml.writeObject(mapIterator.next());
+ }
+ xml.close();
+ }
+ }
+}
More information about the jboss-cvs-commits
mailing list