[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