*** empty log message ***

git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@169 379699f6-c40d-0410-875b-85095c16579e
stable
jochen 26 years ago
parent 4984990fbe
commit 0c77d2f8e9
  1. 99
      jode/JodeAppletOneZero.java
  2. 43
      jode/jode-applet.html
  3. 103
      jode/jode/JodeWindow.java
  4. 2
      jode/jode/bytecode/SearchPath.java
  5. 6
      jode/jode/decompiler/ImportHandler.java
  6. 2
      jode/maketar
  7. 2
      jode/makezips

@ -5,13 +5,12 @@ import java.io.*;
public class JodeAppletOneZero extends Applet implements Runnable { public class JodeAppletOneZero extends Applet implements Runnable {
TextField classpathField; TextField classpathField, classField;
TextField classField; TextArea sourcecodeArea, errorArea;
TextArea sourcecodeArea; Checkbox verboseCheck, prettyCheck;
TextArea errorArea; Button startButton, saveButton;
String lastClassName;
Thread decompileThread;
public JodeAppletOneZero() { public JodeAppletOneZero() {
buildComponents(this); buildComponents(this);
} }
@ -25,23 +24,37 @@ public class JodeAppletOneZero extends Applet implements Runnable {
setClass(cls); setClass(cls);
} }
private void buildComponents(Container frame) { private void buildComponents(Container window) {
classpathField = new TextField(50); classpathField = new TextField(50);
classField = new TextField(50); classField = new TextField(50);
sourcecodeArea = new TextArea(20, 80); sourcecodeArea = new TextArea(20, 80);
errorArea = new TextArea(3, 80); errorArea = new TextArea(3, 80);
verboseCheck = new Checkbox("verbose");
prettyCheck = new Checkbox("pretty");
startButton = new Button("start");
saveButton = new Button("save");
saveButton.disable();
sourcecodeArea.setEditable(false); sourcecodeArea.setEditable(false);
errorArea.setEditable(false); errorArea.setEditable(false);
GridBagLayout gbl = new GridBagLayout(); GridBagLayout gbl = new GridBagLayout();
frame.setLayout(gbl); window.setLayout(gbl);
GridBagConstraints labelConstr = new GridBagConstraints(); GridBagConstraints labelConstr = new GridBagConstraints();
GridBagConstraints textConstr = new GridBagConstraints(); GridBagConstraints textConstr = new GridBagConstraints();
GridBagConstraints areaConstr = new GridBagConstraints(); GridBagConstraints areaConstr = new GridBagConstraints();
GridBagConstraints checkConstr = new GridBagConstraints();
GridBagConstraints buttonConstr = new GridBagConstraints();
labelConstr.fill = GridBagConstraints.NONE; labelConstr.fill = GridBagConstraints.NONE;
textConstr.fill = GridBagConstraints.HORIZONTAL; textConstr.fill = GridBagConstraints.HORIZONTAL;
areaConstr.fill = GridBagConstraints.BOTH; areaConstr.fill = GridBagConstraints.BOTH;
checkConstr.fill = GridBagConstraints.NONE;
buttonConstr.fill = GridBagConstraints.NONE;
labelConstr.anchor = GridBagConstraints.EAST;
textConstr.anchor = GridBagConstraints.CENTER;
checkConstr.anchor = GridBagConstraints.WEST;
buttonConstr.anchor = GridBagConstraints.CENTER;
labelConstr.anchor = GridBagConstraints.EAST;
textConstr.gridwidth = GridBagConstraints.REMAINDER; textConstr.gridwidth = GridBagConstraints.REMAINDER;
textConstr.weightx = 1.0; textConstr.weightx = 1.0;
areaConstr.gridwidth = GridBagConstraints.REMAINDER; areaConstr.gridwidth = GridBagConstraints.REMAINDER;
@ -50,20 +63,34 @@ public class JodeAppletOneZero extends Applet implements Runnable {
Label label = new Label("class path: "); Label label = new Label("class path: ");
gbl.setConstraints(label, labelConstr); gbl.setConstraints(label, labelConstr);
frame.add(label); window.add(label);
gbl.setConstraints(classpathField, textConstr); gbl.setConstraints(classpathField, textConstr);
frame.add(classpathField); window.add(classpathField);
label = new Label("class name: "); label = new Label("class name: ");
gbl.setConstraints(label, labelConstr); gbl.setConstraints(label, labelConstr);
frame.add(label); window.add(label);
gbl.setConstraints(classField, textConstr); gbl.setConstraints(classField, textConstr);
frame.add(classField); window.add(classField);
gbl.setConstraints(verboseCheck, checkConstr);
window.add(verboseCheck);
gbl.setConstraints(prettyCheck, checkConstr);
window.add(prettyCheck);
labelConstr.weightx = 1.0;
label = new Label();
gbl.setConstraints(label, labelConstr);
window.add(label);
gbl.setConstraints(startButton, buttonConstr);
window.add(startButton);
buttonConstr.gridwidth = GridBagConstraints.REMAINDER;
gbl.setConstraints(saveButton, buttonConstr);
window.add(saveButton);
gbl.setConstraints(sourcecodeArea, areaConstr); gbl.setConstraints(sourcecodeArea, areaConstr);
frame.add(sourcecodeArea); window.add(sourcecodeArea);
areaConstr.gridheight = GridBagConstraints.REMAINDER; areaConstr.gridheight = GridBagConstraints.REMAINDER;
areaConstr.weighty = 0.0; areaConstr.weighty = 0.0;
gbl.setConstraints(errorArea, areaConstr); gbl.setConstraints(errorArea, areaConstr);
frame.add(errorArea); window.add(errorArea);
Decompiler.err = new PrintStream(new AreaOutputStream(errorArea)); Decompiler.err = new PrintStream(new AreaOutputStream(errorArea));
} }
@ -76,14 +103,32 @@ public class JodeAppletOneZero extends Applet implements Runnable {
} }
public boolean action(Event e, Object arg) { public boolean action(Event e, Object arg) {
if (e.target == classField) { if (e.target == startButton) {
if (decompileThread == null) { startButton.disable();
decompileThread = new Thread(this); Thread decompileThread = new Thread(this);
sourcecodeArea.setText("Please wait, while decompiling...\n"); sourcecodeArea.setText("Please wait, while decompiling...\n");
decompileThread.start(); decompileThread.start();
} else } else if (e.target == saveButton) {
sourcecodeArea FileDialog fd = new FileDialog(new Frame(),
.appendText("Be a little bit more patient, please.\n"); "Save decompiled code",
FileDialog.SAVE);
fd.setFile(lastClassName.substring
(lastClassName.lastIndexOf('.')+1).concat(".java"));
fd.show();
String fileName = fd.getFile();
if (fileName == null)
return true;
try {
File f = new File(new File(fd.getDirectory()), fileName);
FileWriter out = new FileWriter(f);
out.write(sourcecodeArea.getText());
out.close();
} catch (IOException ex) {
errorArea.setText("");
Decompiler.err.println("Couldn't write to file "
+ fileName + ": ");
ex.printStackTrace(Decompiler.err);
}
} }
return true; return true;
} }
@ -105,7 +150,12 @@ public class JodeAppletOneZero extends Applet implements Runnable {
} }
public void run() { public void run() {
Decompiler.isVerbose = verboseCheck.getState();
Decompiler.prettyLocals = prettyCheck.getState();
errorArea.setText(""); errorArea.setText("");
saveButton.disable();
lastClassName = classField.getText();
String cp = classpathField.getText(); String cp = classpathField.getText();
cp = cp.replace(':', jode.bytecode.SearchPath.protocolSeparator); cp = cp.replace(':', jode.bytecode.SearchPath.protocolSeparator);
cp = cp.replace(',', File.pathSeparatorChar); cp = cp.replace(',', File.pathSeparatorChar);
@ -115,14 +165,13 @@ public class JodeAppletOneZero extends Applet implements Runnable {
TabbedPrintWriter writer = new TabbedPrintWriter(out, " "); TabbedPrintWriter writer = new TabbedPrintWriter(out, " ");
env.doClass(classField.getText(), writer); env.doClass(classField.getText(), writer);
sourcecodeArea.setText(out.toString()); sourcecodeArea.setText(out.toString());
saveButton.enable();
} catch (Throwable t) { } catch (Throwable t) {
sourcecodeArea.setText("Didn't succeed.\n" sourcecodeArea.setText("Didn't succeed.\n"
+"Check the below area for more info."); +"Check the below area for more info.");
t.printStackTrace(Decompiler.err); t.printStackTrace(Decompiler.err);
} finally { } finally {
synchronized(this) { startButton.enable();
decompileThread = null;
}
} }
} }
} }

@ -3,20 +3,45 @@
<title>Jode Test Applet</title> <title>Jode Test Applet</title>
</head> </head>
<body> <body>
Press enter in the class name field to decompile this applet. You may <a href="index.html">Home</a> <a href="jode.html">Up</a>
change the class path and name to point to an class file of your
choice. But note that most browsers doesn't allow loading files from <h1>Test Applet</h1>
a different server.<br> Press the start button to decompile this applet. You may change the
class name to point to an class file of your choice. But
note that most browsers doesn't allow loading files from a different
server.<br>
Save doesn't work in Netscape because the FileDialog is missing
there. But access to local files is most probably forbidden
anyway. <br>
You may give multiple entries in the class path field separated by a
comma. The components may also be local zip or jar files, but that is
probably forbidden by the browser. <br>
You can download <a href="jode/jode-applet.html">HTML-file</a> and BTW: If you just want to read the source, you may <a
this <a href="jode_cls.zip">archive, if you want to test it yourself. href="jode/">browse it online</a><br>
You should use the appletviewer in this case.
<applet code="jode/JodeAppletOneZero.class" codebase="./" width=640 height=400> <applet code="jode/JodeAppletOneZero.class" codebase="./" width=640 height=400>
<param name=classpath <param name=classpath
value="http://nirwana/~jochen/"> value="http://www.informatik.uni-oldenburg.de/~jochen/">
<param name=class value="jode.JodeAppletOneZero"> <param name=class value="jode.JodeAppletOneZero">
</applet> </applet>
You may run this locally; you need at least a java 1.1 compatible
virtual machine and the <a href="jode_cls.zip">decompiler classes</a>.
The entry class is <code>jode.JodeWindow</code>, so you may start it
under SUN JDK with (the exact commands depend on your operating
system, java virtual machine, shell etc):
<pre>
set CLASSPATH=jode_cls.zip
java jode.JodeWindow
</pre>
<a href="jode.html">Back to the Decompiler Page</a>
</body> </body>
</html> </html>

@ -7,49 +7,75 @@ import java.io.*;
public class JodeWindow public class JodeWindow
implements ActionListener, Runnable implements ActionListener, Runnable
{ {
TextField classpathField; TextField classpathField, classField;
TextField classField; TextArea sourcecodeArea, errorArea;
TextArea sourcecodeArea; Checkbox verboseCheck, prettyCheck;
TextArea errorArea; Button startButton, saveButton;
String lastClassName;
Frame frame;
Thread decompileThread; Thread decompileThread;
public JodeWindow(Container frame) { public JodeWindow(Container window) {
buildComponents(frame); buildComponents(window);
} }
private void buildComponents(Container frame) { private void buildComponents(Container window) {
if (window instanceof Frame)
frame = (Frame) window;
classpathField = new TextField(50); classpathField = new TextField(50);
classField = new TextField(50); classField = new TextField(50);
sourcecodeArea = new TextArea(20, 80); sourcecodeArea = new TextArea(20, 80);
errorArea = new TextArea(3, 80); errorArea = new TextArea(3, 80);
verboseCheck = new Checkbox("verbose", false);
prettyCheck = new Checkbox("pretty", false);
startButton = new Button("start");
saveButton = new Button("save");
saveButton.setEnabled(false);
sourcecodeArea.setEditable(false); sourcecodeArea.setEditable(false);
errorArea.setEditable(false); errorArea.setEditable(false);
frame.setLayout(new GridBagLayout()); window.setLayout(new GridBagLayout());
GridBagConstraints labelConstr = new GridBagConstraints(); GridBagConstraints labelConstr = new GridBagConstraints();
GridBagConstraints textConstr = new GridBagConstraints(); GridBagConstraints textConstr = new GridBagConstraints();
GridBagConstraints areaConstr = new GridBagConstraints(); GridBagConstraints areaConstr = new GridBagConstraints();
GridBagConstraints checkConstr = new GridBagConstraints();
GridBagConstraints buttonConstr = new GridBagConstraints();
labelConstr.fill = GridBagConstraints.NONE; labelConstr.fill = GridBagConstraints.NONE;
textConstr.fill = GridBagConstraints.HORIZONTAL; textConstr.fill = GridBagConstraints.HORIZONTAL;
areaConstr.fill = GridBagConstraints.BOTH; areaConstr.fill = GridBagConstraints.BOTH;
checkConstr.fill = GridBagConstraints.NONE;
buttonConstr.fill = GridBagConstraints.NONE;
labelConstr.anchor = GridBagConstraints.EAST;
textConstr.anchor = GridBagConstraints.CENTER;
checkConstr.anchor = GridBagConstraints.WEST;
buttonConstr.anchor = GridBagConstraints.CENTER;
labelConstr.anchor = GridBagConstraints.EAST;
textConstr.gridwidth = GridBagConstraints.REMAINDER; textConstr.gridwidth = GridBagConstraints.REMAINDER;
textConstr.weightx = 1.0; textConstr.weightx = 1.0;
areaConstr.gridwidth = GridBagConstraints.REMAINDER; areaConstr.gridwidth = GridBagConstraints.REMAINDER;
areaConstr.weightx = 1.0; areaConstr.weightx = 1.0;
areaConstr.weighty = 1.0; areaConstr.weighty = 1.0;
frame.add(new Label("class path: "), labelConstr); window.add(new Label("class path: "), labelConstr);
frame.add(classpathField, textConstr); window.add(classpathField, textConstr);
frame.add(new Label("class name: "), labelConstr); window.add(new Label("class name: "), labelConstr);
frame.add(classField, textConstr); window.add(classField, textConstr);
frame.add(sourcecodeArea, areaConstr); window.add(verboseCheck, checkConstr);
window.add(prettyCheck, checkConstr);
labelConstr.weightx = 1.0;
window.add(new Label(), labelConstr);
window.add(startButton, buttonConstr);
buttonConstr.gridwidth = GridBagConstraints.REMAINDER;
window.add(saveButton, buttonConstr);
window.add(sourcecodeArea, areaConstr);
areaConstr.gridheight = GridBagConstraints.REMAINDER; areaConstr.gridheight = GridBagConstraints.REMAINDER;
areaConstr.weighty = 0.0; areaConstr.weighty = 0.0;
frame.add(errorArea, areaConstr); window.add(errorArea, areaConstr);
classField.addActionListener(this); startButton.addActionListener(this);
saveButton.addActionListener(this);
String cp = System.getProperty("java.class.path"); String cp = System.getProperty("java.class.path");
if (cp != null) if (cp != null)
@ -61,19 +87,42 @@ public class JodeWindow
} }
public void setClasspath(String cp) { public void setClasspath(String cp) {
classpathField.setText(cp); classpathField.setText(cp.replace(File.pathSeparatorChar, ','));
} }
public void setClass(String cls) { public void setClass(String cls) {
classField.setText(cls); classField.setText(cls);
} }
public synchronized void actionPerformed(ActionEvent e) { public synchronized void actionPerformed(ActionEvent e) {
if (decompileThread == null) { if (e.getSource() == startButton) {
startButton.setEnabled(false);
decompileThread = new Thread(this); decompileThread = new Thread(this);
sourcecodeArea.setText("Please wait, while decompiling...\n"); sourcecodeArea.setText("Please wait, while decompiling...\n");
decompileThread.start(); decompileThread.start();
} else } else if (e.getSource() == saveButton) {
sourcecodeArea.append("Be a little bit more patient, please.\n"); if (frame == null)
frame = new Frame(); //XXX
FileDialog fd = new FileDialog(frame,
"Save decompiled code",
FileDialog.SAVE);
fd.setFile(lastClassName.substring
(lastClassName.lastIndexOf('.')+1).concat(".java"));
fd.show();
String fileName = fd.getFile();
if (fileName == null)
return;
try {
File f = new File(new File(fd.getDirectory()), fileName);
FileWriter out = new FileWriter(f);
out.write(sourcecodeArea.getText());
out.close();
} catch (IOException ex) {
errorArea.setText("");
Decompiler.err.println("Couldn't write to file "
+ fileName + ": ");
ex.printStackTrace(Decompiler.err);
}
}
} }
public class AreaOutputStream extends OutputStream { public class AreaOutputStream extends OutputStream {
@ -93,13 +142,22 @@ public class JodeWindow
} }
public void run() { public void run() {
JodeEnvironment env = new JodeEnvironment(classpathField.getText()); Decompiler.isVerbose = verboseCheck.getState();
ByteArrayOutputStream out = new ByteArrayOutputStream(); Decompiler.prettyLocals = prettyCheck.getState();
errorArea.setText(""); errorArea.setText("");
saveButton.setEnabled(false);
lastClassName = classField.getText();
String cp = classpathField.getText();
cp = cp.replace(':', jode.bytecode.SearchPath.protocolSeparator);
cp = cp.replace(',', File.pathSeparatorChar);
JodeEnvironment env = new JodeEnvironment(cp);
ByteArrayOutputStream out = new ByteArrayOutputStream();
try { try {
TabbedPrintWriter writer = new TabbedPrintWriter(out, " "); TabbedPrintWriter writer = new TabbedPrintWriter(out, " ");
env.doClass(classField.getText(), writer); env.doClass(lastClassName, writer);
sourcecodeArea.setText(out.toString()); sourcecodeArea.setText(out.toString());
saveButton.setEnabled(true);
} catch (Throwable t) { } catch (Throwable t) {
sourcecodeArea.setText("Didn't succeed.\n" sourcecodeArea.setText("Didn't succeed.\n"
+"Check the below area for more info."); +"Check the below area for more info.");
@ -107,6 +165,7 @@ public class JodeWindow
} finally { } finally {
synchronized(this) { synchronized(this) {
decompileThread = null; decompileThread = null;
startButton.setEnabled(true);
} }
} }
} }

@ -140,11 +140,13 @@ public class SearchPath {
try { try {
URL url = new URL(bases[i], filename); URL url = new URL(bases[i], filename);
URLConnection conn = url.openConnection(); URLConnection conn = url.openConnection();
conn.setAllowUserInteraction(true);
return conn.getInputStream(); return conn.getInputStream();
} catch (SecurityException ex) { } catch (SecurityException ex) {
Decompiler.err.println("Warning: SecurityException" Decompiler.err.println("Warning: SecurityException"
+" while accessing " +" while accessing "
+bases[i]+filename); +bases[i]+filename);
ex.printStackTrace(Decompiler.err);
/* ignore and take next element */ /* ignore and take next element */
} catch (FileNotFoundException ex) { } catch (FileNotFoundException ex) {
/* ignore and take next element */ /* ignore and take next element */

@ -34,9 +34,6 @@ public class JodeEnvironment {
public JodeEnvironment(String path) { public JodeEnvironment(String path) {
ClassInfo.setClassPath(path); ClassInfo.setClassPath(path);
Type.setEnvironment(this); Type.setEnvironment(this);
imports = new Hashtable();
/* java.lang is always imported */
imports.put("java.lang.*", new Integer(Integer.MAX_VALUE));
} }
/** /**
@ -162,6 +159,9 @@ public class JodeEnvironment {
throws IOException throws IOException
{ {
ClassInfo clazz; ClassInfo clazz;
imports = new Hashtable();
/* java.lang is always imported */
imports.put("java.lang.*", new Integer(Integer.MAX_VALUE));
try { try {
clazz = ClassInfo.forName(className); clazz = ClassInfo.forName(className);
} catch (IllegalArgumentException ex) { } catch (IllegalArgumentException ex) {

@ -5,6 +5,8 @@ echo co -u COPYING *.java */*.java >> co.all
echo javac -d \$HOME/java -g Decompiler.java >> co.all echo javac -d \$HOME/java -g Decompiler.java >> co.all
echo javac -d \$HOME/java -g Obfuscator.java >> co.all echo javac -d \$HOME/java -g Obfuscator.java >> co.all
echo javac -d \$HOME/java -g JodeApplet.java >> co.all echo javac -d \$HOME/java -g JodeApplet.java >> co.all
echo javac -d \$HOME/java -g JodeWindow.java >> co.all
echo javac -d \$HOME/java -g JodeAppletOneZero.java >> co.all
cd .. cd ..
tar -cvzf jode.tar.gz jode/co.all jode/RCS jode/*/RCS tar -cvzf jode.tar.gz jode/co.all jode/RCS jode/*/RCS

@ -2,4 +2,4 @@
cd .. cd ..
zip jode/jode_src.zip jode/COPYING jode/*.java jode/*/*.java zip jode/jode_src.zip jode/COPYING jode/*.java jode/*/*.java
zip jode/jode_cls.zip jode/*.class jode/*/*.class zip jode/jode_cls.zip jode/*.class jode/*/*.class
jar -cvf jode/jode.jar jode/*.class jode/*/*.class jar -cvf jode/jode.jar jode/*.class jode/*/*.class

Loading…
Cancel
Save