From 0c77d2f8e9e2778e066a9fbaa68fde3ba314ce11 Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 21 Jan 1999 22:03:24 +0000 Subject: [PATCH] *** empty log message *** git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@169 379699f6-c40d-0410-875b-85095c16579e --- jode/JodeAppletOneZero.java | 99 +++++++++++++++++------ jode/jode-applet.html | 43 +++++++--- jode/jode/JodeWindow.java | 103 +++++++++++++++++++----- jode/jode/bytecode/SearchPath.java | 2 + jode/jode/decompiler/ImportHandler.java | 6 +- jode/maketar | 2 + jode/makezips | 2 +- 7 files changed, 197 insertions(+), 60 deletions(-) diff --git a/jode/JodeAppletOneZero.java b/jode/JodeAppletOneZero.java index 73f37cb..e57cf74 100644 --- a/jode/JodeAppletOneZero.java +++ b/jode/JodeAppletOneZero.java @@ -5,13 +5,12 @@ import java.io.*; public class JodeAppletOneZero extends Applet implements Runnable { - TextField classpathField; - TextField classField; - TextArea sourcecodeArea; - TextArea errorArea; + TextField classpathField, classField; + TextArea sourcecodeArea, errorArea; + Checkbox verboseCheck, prettyCheck; + Button startButton, saveButton; + String lastClassName; - Thread decompileThread; - public JodeAppletOneZero() { buildComponents(this); } @@ -25,23 +24,37 @@ public class JodeAppletOneZero extends Applet implements Runnable { setClass(cls); } - private void buildComponents(Container frame) { + private void buildComponents(Container window) { classpathField = new TextField(50); classField = new TextField(50); sourcecodeArea = new TextArea(20, 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); errorArea.setEditable(false); GridBagLayout gbl = new GridBagLayout(); - frame.setLayout(gbl); + window.setLayout(gbl); GridBagConstraints labelConstr = new GridBagConstraints(); GridBagConstraints textConstr = new GridBagConstraints(); GridBagConstraints areaConstr = new GridBagConstraints(); + GridBagConstraints checkConstr = new GridBagConstraints(); + GridBagConstraints buttonConstr = new GridBagConstraints(); labelConstr.fill = GridBagConstraints.NONE; textConstr.fill = GridBagConstraints.HORIZONTAL; 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.weightx = 1.0; areaConstr.gridwidth = GridBagConstraints.REMAINDER; @@ -50,20 +63,34 @@ public class JodeAppletOneZero extends Applet implements Runnable { Label label = new Label("class path: "); gbl.setConstraints(label, labelConstr); - frame.add(label); + window.add(label); gbl.setConstraints(classpathField, textConstr); - frame.add(classpathField); + window.add(classpathField); label = new Label("class name: "); gbl.setConstraints(label, labelConstr); - frame.add(label); + window.add(label); 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); - frame.add(sourcecodeArea); + window.add(sourcecodeArea); areaConstr.gridheight = GridBagConstraints.REMAINDER; areaConstr.weighty = 0.0; gbl.setConstraints(errorArea, areaConstr); - frame.add(errorArea); + window.add(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) { - if (e.target == classField) { - if (decompileThread == null) { - decompileThread = new Thread(this); - sourcecodeArea.setText("Please wait, while decompiling...\n"); - decompileThread.start(); - } else - sourcecodeArea - .appendText("Be a little bit more patient, please.\n"); + if (e.target == startButton) { + startButton.disable(); + Thread decompileThread = new Thread(this); + sourcecodeArea.setText("Please wait, while decompiling...\n"); + decompileThread.start(); + } else if (e.target == saveButton) { + FileDialog fd = new FileDialog(new 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 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; } @@ -105,7 +150,12 @@ public class JodeAppletOneZero extends Applet implements Runnable { } public void run() { + Decompiler.isVerbose = verboseCheck.getState(); + Decompiler.prettyLocals = prettyCheck.getState(); errorArea.setText(""); + saveButton.disable(); + lastClassName = classField.getText(); + String cp = classpathField.getText(); cp = cp.replace(':', jode.bytecode.SearchPath.protocolSeparator); cp = cp.replace(',', File.pathSeparatorChar); @@ -115,14 +165,13 @@ public class JodeAppletOneZero extends Applet implements Runnable { TabbedPrintWriter writer = new TabbedPrintWriter(out, " "); env.doClass(classField.getText(), writer); sourcecodeArea.setText(out.toString()); + saveButton.enable(); } catch (Throwable t) { sourcecodeArea.setText("Didn't succeed.\n" +"Check the below area for more info."); t.printStackTrace(Decompiler.err); } finally { - synchronized(this) { - decompileThread = null; - } + startButton.enable(); } } } diff --git a/jode/jode-applet.html b/jode/jode-applet.html index 6ad1dd0..26387a3 100644 --- a/jode/jode-applet.html +++ b/jode/jode-applet.html @@ -3,20 +3,45 @@ Jode Test Applet + -Press enter in the class name field to decompile this applet. You may -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 -a different server.
+Home Up + +

Test Applet

+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.
+ +Save doesn't work in Netscape because the FileDialog is missing +there. But access to local files is most probably forbidden +anyway.
+ +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.
-You can download HTML-file and -this archive, if you want to test it yourself. -You should use the appletviewer in this case. +BTW: If you just want to read the source, you may browse it online
+value="http://www.informatik.uni-oldenburg.de/~jochen/"> + +You may run this locally; you need at least a java 1.1 compatible +virtual machine and the decompiler classes. +The entry class is jode.JodeWindow, so you may start it +under SUN JDK with (the exact commands depend on your operating +system, java virtual machine, shell etc): + +
+  set CLASSPATH=jode_cls.zip
+  java jode.JodeWindow
+
+ +Back to the Decompiler Page + - \ No newline at end of file + diff --git a/jode/jode/JodeWindow.java b/jode/jode/JodeWindow.java index 21f697a..69a3aa0 100644 --- a/jode/jode/JodeWindow.java +++ b/jode/jode/JodeWindow.java @@ -7,49 +7,75 @@ import java.io.*; public class JodeWindow implements ActionListener, Runnable { - TextField classpathField; - TextField classField; - TextArea sourcecodeArea; - TextArea errorArea; + TextField classpathField, classField; + TextArea sourcecodeArea, errorArea; + Checkbox verboseCheck, prettyCheck; + Button startButton, saveButton; + String lastClassName; + Frame frame; Thread decompileThread; - public JodeWindow(Container frame) { - buildComponents(frame); + public JodeWindow(Container window) { + buildComponents(window); } - private void buildComponents(Container frame) { + private void buildComponents(Container window) { + if (window instanceof Frame) + frame = (Frame) window; classpathField = new TextField(50); classField = new TextField(50); sourcecodeArea = new TextArea(20, 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); errorArea.setEditable(false); - frame.setLayout(new GridBagLayout()); + window.setLayout(new GridBagLayout()); GridBagConstraints labelConstr = new GridBagConstraints(); GridBagConstraints textConstr = new GridBagConstraints(); GridBagConstraints areaConstr = new GridBagConstraints(); + GridBagConstraints checkConstr = new GridBagConstraints(); + GridBagConstraints buttonConstr = new GridBagConstraints(); labelConstr.fill = GridBagConstraints.NONE; textConstr.fill = GridBagConstraints.HORIZONTAL; 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.weightx = 1.0; areaConstr.gridwidth = GridBagConstraints.REMAINDER; areaConstr.weightx = 1.0; areaConstr.weighty = 1.0; - frame.add(new Label("class path: "), labelConstr); - frame.add(classpathField, textConstr); - frame.add(new Label("class name: "), labelConstr); - frame.add(classField, textConstr); - frame.add(sourcecodeArea, areaConstr); + window.add(new Label("class path: "), labelConstr); + window.add(classpathField, textConstr); + window.add(new Label("class name: "), labelConstr); + window.add(classField, textConstr); + 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.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"); if (cp != null) @@ -61,19 +87,42 @@ public class JodeWindow } public void setClasspath(String cp) { - classpathField.setText(cp); + classpathField.setText(cp.replace(File.pathSeparatorChar, ',')); } public void setClass(String cls) { classField.setText(cls); } public synchronized void actionPerformed(ActionEvent e) { - if (decompileThread == null) { + if (e.getSource() == startButton) { + startButton.setEnabled(false); decompileThread = new Thread(this); sourcecodeArea.setText("Please wait, while decompiling...\n"); decompileThread.start(); - } else - sourcecodeArea.append("Be a little bit more patient, please.\n"); + } else if (e.getSource() == saveButton) { + 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 { @@ -93,13 +142,22 @@ public class JodeWindow } public void run() { - JodeEnvironment env = new JodeEnvironment(classpathField.getText()); - ByteArrayOutputStream out = new ByteArrayOutputStream(); + Decompiler.isVerbose = verboseCheck.getState(); + Decompiler.prettyLocals = prettyCheck.getState(); 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 { TabbedPrintWriter writer = new TabbedPrintWriter(out, " "); - env.doClass(classField.getText(), writer); + env.doClass(lastClassName, writer); sourcecodeArea.setText(out.toString()); + saveButton.setEnabled(true); } catch (Throwable t) { sourcecodeArea.setText("Didn't succeed.\n" +"Check the below area for more info."); @@ -107,6 +165,7 @@ public class JodeWindow } finally { synchronized(this) { decompileThread = null; + startButton.setEnabled(true); } } } diff --git a/jode/jode/bytecode/SearchPath.java b/jode/jode/bytecode/SearchPath.java index a25ff44..69d709e 100644 --- a/jode/jode/bytecode/SearchPath.java +++ b/jode/jode/bytecode/SearchPath.java @@ -140,11 +140,13 @@ public class SearchPath { try { URL url = new URL(bases[i], filename); URLConnection conn = url.openConnection(); + conn.setAllowUserInteraction(true); return conn.getInputStream(); } catch (SecurityException ex) { Decompiler.err.println("Warning: SecurityException" +" while accessing " +bases[i]+filename); + ex.printStackTrace(Decompiler.err); /* ignore and take next element */ } catch (FileNotFoundException ex) { /* ignore and take next element */ diff --git a/jode/jode/decompiler/ImportHandler.java b/jode/jode/decompiler/ImportHandler.java index b2e8051..9aa0bdc 100644 --- a/jode/jode/decompiler/ImportHandler.java +++ b/jode/jode/decompiler/ImportHandler.java @@ -34,9 +34,6 @@ public class JodeEnvironment { public JodeEnvironment(String path) { ClassInfo.setClassPath(path); 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 { ClassInfo clazz; + imports = new Hashtable(); + /* java.lang is always imported */ + imports.put("java.lang.*", new Integer(Integer.MAX_VALUE)); try { clazz = ClassInfo.forName(className); } catch (IllegalArgumentException ex) { diff --git a/jode/maketar b/jode/maketar index 3fc8705..ce7daa4 100755 --- a/jode/maketar +++ b/jode/maketar @@ -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 Obfuscator.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 .. tar -cvzf jode.tar.gz jode/co.all jode/RCS jode/*/RCS diff --git a/jode/makezips b/jode/makezips index 3ce3160..d3e00ad 100755 --- a/jode/makezips +++ b/jode/makezips @@ -2,4 +2,4 @@ cd .. zip jode/jode_src.zip jode/COPYING jode/*.java jode/*/*.java zip jode/jode_cls.zip jode/*.class jode/*/*.class -jar -cvf jode/jode.jar jode/*.class jode/*/*.class \ No newline at end of file +jar -cvf jode/jode.jar jode/*.class jode/*/*.class