From b72c5c2e5482cf10117b2b25f642f7616b2326c3 Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Mon, 31 Aug 2009 10:12:00 -0700 Subject: ProGuard 4.4 --- src/proguard/gui/ReTraceRunnable.java | 149 ++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 src/proguard/gui/ReTraceRunnable.java (limited to 'src/proguard/gui/ReTraceRunnable.java') diff --git a/src/proguard/gui/ReTraceRunnable.java b/src/proguard/gui/ReTraceRunnable.java new file mode 100644 index 0000000..1ca19ca --- /dev/null +++ b/src/proguard/gui/ReTraceRunnable.java @@ -0,0 +1,149 @@ +/* + * ProGuard -- shrinking, optimization, obfuscation, and preverification + * of Java bytecode. + * + * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package proguard.gui; + +import proguard.retrace.ReTrace; + +import javax.swing.*; +import java.awt.*; +import java.io.*; + + +/** + * This Runnable runs ReTrace, sending console output to a text + * area and any exceptions to message dialogs. + * + * @see ReTrace + * @author Eric Lafortune + */ +final class ReTraceRunnable implements Runnable +{ + private final JTextArea consoleTextArea; + private final boolean verbose; + private final File mappingFile; + private final String stackTrace; + + + /** + * Creates a new ProGuardRunnable object. + * @param consoleTextArea the text area to send the console output to. + * @param verbose specifies whether the de-obfuscated stack trace + * should be verbose. + * @param mappingFile the mapping file that was written out by ProGuard. + */ + public ReTraceRunnable(JTextArea consoleTextArea, + boolean verbose, + File mappingFile, + String stackTrace) + { + this.consoleTextArea = consoleTextArea; + this.verbose = verbose; + this.mappingFile = mappingFile; + this.stackTrace = stackTrace; + } + + + // Implementation for Runnable. + + public void run() + { + consoleTextArea.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + consoleTextArea.setText(""); + + // Redirect the stack trace string to the System's in stream, and the + // out and err streams to the console text area. + InputStream oldIn = System.in; + PrintStream oldOut = System.out; + PrintStream oldErr = System.err; + + ByteArrayInputStream inputStream = + new ByteArrayInputStream(stackTrace.getBytes()); + + PrintStream printStream = + new PrintStream(new TextAreaOutputStream(consoleTextArea), true); + + System.setIn(inputStream); + System.setOut(printStream); + System.setErr(printStream); + + try + { + // Create a new ProGuard object with the GUI's configuration. + ReTrace reTrace = new ReTrace(ReTrace.STACK_TRACE_EXPRESSION, + verbose, + mappingFile); + + // Run it. + reTrace.execute(); + } + catch (Exception ex) + { + // Print out the exception message. + System.out.println(ex.getMessage()); + + // Show a dialog as well. + MessageDialogRunnable.showMessageDialog(consoleTextArea, + ex.getMessage(), + msg("errorReTracing"), + JOptionPane.ERROR_MESSAGE); + } + catch (OutOfMemoryError er) + { + // Forget about the ProGuard object as quickly as possible. + System.gc(); + + // Print out a message suggesting what to do next. + System.out.println(msg("outOfMemory")); + + // Show a dialog as well. + MessageDialogRunnable.showMessageDialog(consoleTextArea, + msg("outOfMemory"), + msg("errorReTracing"), + JOptionPane.ERROR_MESSAGE); + } + + // Make sure all output has been sent to the console text area. + printStream.flush(); + + // Restore the old System's in, out, and err streams. + System.setIn(oldIn); + System.setOut(oldOut); + System.setErr(oldErr); + + consoleTextArea.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + consoleTextArea.setCaretPosition(0); + + // Reset the global static redirection lock. + ProGuardGUI.systemOutRedirected = false; + } + + + // Small utility methods. + + /** + * Returns the message from the GUI resources that corresponds to the given + * key. + */ + private String msg(String messageKey) + { + return GUIResources.getMessage(messageKey); + } +} -- cgit v1.2.3