|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package sun.tools.serialver; |
|
|
|
import java.io.*; |
|
import java.awt.*; |
|
import java.applet.*; |
|
import java.io.ObjectStreamClass; |
|
import java.util.Properties; |
|
import java.text.MessageFormat; |
|
import java.util.ResourceBundle; |
|
import java.util.MissingResourceException; |
|
import java.net.URLClassLoader; |
|
import java.net.URL; |
|
import java.net.MalformedURLException; |
|
import java.util.StringTokenizer; |
|
import sun.net.www.ParseUtil; |
|
|
|
public class SerialVer extends Applet { |
|
GridBagLayout gb; |
|
TextField classname_t; |
|
Button show_b; |
|
TextField serialversion_t; |
|
Label footer_l; |
|
|
|
private static final long serialVersionUID = 7666909783837760853L; |
|
|
|
public synchronized void init() { |
|
gb = new GridBagLayout(); |
|
setLayout(gb); |
|
|
|
GridBagConstraints c = new GridBagConstraints(); |
|
c.fill = GridBagConstraints.BOTH; |
|
|
|
Label l1 = new Label(Res.getText("FullClassName")); |
|
l1.setAlignment(Label.RIGHT); |
|
gb.setConstraints(l1, c); |
|
add(l1); |
|
|
|
classname_t = new TextField(20); |
|
c.gridwidth = GridBagConstraints.RELATIVE; |
|
c.weightx = 1.0; |
|
gb.setConstraints(classname_t, c); |
|
add(classname_t); |
|
|
|
show_b = new Button(Res.getText("Show")); |
|
c.gridwidth = GridBagConstraints.REMAINDER; |
|
c.weightx = 0.0; |
|
gb.setConstraints(show_b, c); |
|
add(show_b); |
|
|
|
Label l2 = new Label(Res.getText("SerialVersion")); |
|
l2.setAlignment(Label.RIGHT); |
|
c.gridwidth = 1; |
|
gb.setConstraints(l2, c); |
|
add(l2); |
|
|
|
serialversion_t = new TextField(50); |
|
serialversion_t.setEditable(false); |
|
c.gridwidth = GridBagConstraints.REMAINDER; |
|
gb.setConstraints(serialversion_t, c); |
|
add(serialversion_t); |
|
|
|
footer_l = new Label(); |
|
c.gridwidth = GridBagConstraints.REMAINDER; |
|
gb.setConstraints(footer_l, c); |
|
add(footer_l); |
|
|
|
|
|
classname_t.requestFocus(); |
|
} |
|
|
|
public void start() { |
|
|
|
classname_t.requestFocus(); |
|
} |
|
|
|
@SuppressWarnings("deprecation") |
|
public boolean action(Event ev, Object obj) { |
|
if (ev.target == classname_t) { |
|
show((String)ev.arg); |
|
return true; |
|
} else if (ev.target == show_b) { |
|
show(classname_t.getText()); |
|
return true; |
|
} |
|
return false; |
|
} |
|
|
|
|
|
@SuppressWarnings("deprecation") |
|
public boolean handleEvent(Event ev) { |
|
boolean rc = super.handleEvent(ev); |
|
return rc; |
|
} |
|
|
|
|
|
|
|
*/ |
|
void show(String classname) { |
|
try { |
|
footer_l.setText(""); |
|
serialversion_t.setText(""); |
|
|
|
if (classname.equals("")) { |
|
return; |
|
} |
|
|
|
String s = serialSyntax(classname); |
|
if (s != null) { |
|
serialversion_t.setText(s); |
|
} else { |
|
footer_l.setText(Res.getText("NotSerializable", classname)); |
|
} |
|
} catch (ClassNotFoundException cnf) { |
|
footer_l.setText(Res.getText("ClassNotFound", classname)); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
static URLClassLoader loader = null; |
|
|
|
|
|
|
|
|
|
*/ |
|
static void initializeLoader(String cp) |
|
throws MalformedURLException, IOException { |
|
URL[] urls; |
|
StringTokenizer st = new StringTokenizer(cp, File.pathSeparator); |
|
int count = st.countTokens(); |
|
urls = new URL[count]; |
|
for (int i = 0; i < count; i++) { |
|
urls[i] = ParseUtil.fileToEncodedURL( |
|
new File(new File(st.nextToken()).getCanonicalPath())); |
|
} |
|
loader = new URLClassLoader(urls); |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
static String serialSyntax(String classname) throws ClassNotFoundException { |
|
String ret = null; |
|
boolean classFound = false; |
|
|
|
|
|
if (classname.indexOf('$') != -1) { |
|
ret = resolveClass(classname); |
|
} else { |
|
|
|
|
|
|
|
*/ |
|
try { |
|
ret = resolveClass(classname); |
|
classFound = true; |
|
} catch (ClassNotFoundException e) { |
|
/* Class not found so far */ |
|
} |
|
if (!classFound) { |
|
StringBuffer workBuffer = new StringBuffer(classname); |
|
String workName = workBuffer.toString(); |
|
int i; |
|
while ((i = workName.lastIndexOf('.')) != -1 && !classFound) { |
|
workBuffer.setCharAt(i, '$'); |
|
try { |
|
workName = workBuffer.toString(); |
|
ret = resolveClass(workName); |
|
classFound = true; |
|
} catch (ClassNotFoundException e) { |
|
/* Continue searching */ |
|
} |
|
} |
|
} |
|
if (!classFound) { |
|
throw new ClassNotFoundException(); |
|
} |
|
} |
|
return ret; |
|
} |
|
|
|
static String resolveClass(String classname) throws ClassNotFoundException { |
|
Class<?> cl = Class.forName(classname, false, loader); |
|
ObjectStreamClass desc = ObjectStreamClass.lookup(cl); |
|
if (desc != null) { |
|
return " private static final long serialVersionUID = " + |
|
desc.getSerialVersionUID() + "L;"; |
|
} else { |
|
return null; |
|
} |
|
} |
|
|
|
@SuppressWarnings("deprecation") |
|
private static void showWindow(Window w) { |
|
w.show(); |
|
} |
|
|
|
public static void main(String[] args) { |
|
boolean show = false; |
|
String envcp = null; |
|
int i = 0; |
|
|
|
if (args.length == 0) { |
|
usage(); |
|
System.exit(1); |
|
} |
|
|
|
for (i = 0; i < args.length; i++) { |
|
if (args[i].equals("-show")) { |
|
show = true; |
|
} else if (args[i].equals("-classpath")) { |
|
if ((i+1 == args.length) || args[i+1].startsWith("-")) { |
|
System.err.println(Res.getText("error.missing.classpath")); |
|
usage(); |
|
System.exit(1); |
|
} |
|
envcp = new String(args[i+1]); |
|
i++; |
|
} else if (args[i].startsWith("-")) { |
|
System.err.println(Res.getText("invalid.flag", args[i])); |
|
usage(); |
|
System.exit(1); |
|
} else { |
|
break; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
if (envcp == null) { |
|
envcp = System.getProperty("env.class.path"); |
|
|
|
|
|
*/ |
|
if (envcp == null) { |
|
envcp = "."; |
|
} |
|
} |
|
|
|
try { |
|
initializeLoader(envcp); |
|
} catch (MalformedURLException mue) { |
|
System.err.println(Res.getText("error.parsing.classpath", envcp)); |
|
System.exit(2); |
|
} catch (IOException ioe) { |
|
System.err.println(Res.getText("error.parsing.classpath", envcp)); |
|
System.exit(3); |
|
} |
|
|
|
if (!show) { |
|
|
|
|
|
|
|
*/ |
|
if (i == args.length) { |
|
usage(); |
|
System.exit(1); |
|
} |
|
|
|
|
|
|
|
*/ |
|
boolean exitFlag = false; |
|
for (i = i; i < args.length; i++ ) { |
|
try { |
|
String syntax = serialSyntax(args[i]); |
|
if (syntax != null) |
|
System.out.println(args[i] + ":" + syntax); |
|
else { |
|
System.err.println(Res.getText("NotSerializable", |
|
args[i])); |
|
exitFlag = true; |
|
} |
|
} catch (ClassNotFoundException cnf) { |
|
System.err.println(Res.getText("ClassNotFound", args[i])); |
|
exitFlag = true; |
|
} |
|
} |
|
if (exitFlag) { |
|
System.exit(1); |
|
} |
|
} else { |
|
if (i < args.length) { |
|
System.err.println(Res.getText("ignoring.classes")); |
|
System.exit(1); |
|
} |
|
Frame f = new SerialVerFrame(); |
|
|
|
SerialVer sv = new SerialVer(); |
|
sv.init(); |
|
|
|
f.add("Center", sv); |
|
f.pack(); |
|
showWindow(f); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
public static void usage() { |
|
System.err.println(Res.getText("usage")); |
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
class SerialVerFrame extends Frame { |
|
MenuBar menu_mb; |
|
Menu file_m; |
|
MenuItem exit_i; |
|
|
|
private static final long serialVersionUID = -7248105987187532533L; |
|
|
|
|
|
|
|
*/ |
|
SerialVerFrame() { |
|
super(Res.getText("SerialVersionInspector")); |
|
|
|
|
|
file_m = new Menu(Res.getText("File")); |
|
file_m.add(exit_i = new MenuItem(Res.getText("Exit"))); |
|
|
|
|
|
menu_mb = new MenuBar(); |
|
menu_mb.add(file_m); |
|
|
|
/* Add the menubar to the frame */ |
|
// Bug in JDK1.1 setMenuBar(menu_mb); |
|
} |
|
|
|
|
|
|
|
*/ |
|
@SuppressWarnings("deprecation") |
|
public boolean handleEvent(Event e) { |
|
if (e.id == Event.WINDOW_DESTROY) { |
|
exit(0); |
|
} |
|
return super.handleEvent(e); |
|
} |
|
|
|
|
|
*/ |
|
@SuppressWarnings("deprecation") |
|
public boolean action(Event ev, Object obj) { |
|
if (ev.target == exit_i) { |
|
exit(0); |
|
} |
|
return false; |
|
} |
|
|
|
|
|
|
|
*/ |
|
void exit(int ret) { |
|
System.exit(ret); |
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
class Res { |
|
|
|
private static ResourceBundle messageRB; |
|
|
|
|
|
|
|
*/ |
|
static void initResource() { |
|
try { |
|
messageRB = |
|
ResourceBundle.getBundle("sun.tools.serialver.resources.serialver"); |
|
} catch (MissingResourceException e) { |
|
throw new Error("Fatal: Resource for serialver is missing"); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
static String getText(String key) { |
|
return getText(key, (String)null); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
static String getText(String key, String a1) { |
|
return getText(key, a1, null); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
static String getText(String key, String a1, String a2) { |
|
return getText(key, a1, a2, null); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
static String getText(String key, String a1, String a2, String a3) { |
|
if (messageRB == null) { |
|
initResource(); |
|
} |
|
try { |
|
String message = messageRB.getString(key); |
|
return MessageFormat.format(message, a1, a2, a3); |
|
} catch (MissingResourceException e) { |
|
throw new Error("Fatal: Resource for serialver is broken. There is no " + key + " key in resource."); |
|
} |
|
} |
|
} |