001: /* ===========================================================================
002: * $RCSfile: RGtraceImpl.java,v $
003: * ===========================================================================
004: *
005: * RetroGuard -- an obfuscation package for Java classfiles.
006: *
007: * Copyright (c) 1998-2006 Mark Welsh (markw@retrologic.com)
008: *
009: * This program can be redistributed and/or modified under the terms of the
010: * Version 2 of the GNU General Public License as published by the Free
011: * Software Foundation.
012: *
013: * This program is distributed in the hope that it will be useful,
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016: * GNU General Public License for more details.
017: *
018: */
019:
020: package COM.rl.obf;
021:
022: import java.io.*;
023: import java.util.*;
024: import COM.rl.obf.patch.*;
025:
026: /**
027: * Main class for stacktrace utility. Converts from obfuscated to normal
028: * method names in stack traces (multi-valued due to method overloading).
029: *
030: * @author Mark Welsh
031: */
032: public class RGtraceImpl {
033: // Class Methods ---------------------------------------------------------
034: /**
035: * Main entry point for the converter.
036: *
037: * @param rgsFilename log-file name from the obfuscation.
038: * @param inTraceFilename obfuscated stack trace file
039: * @param outTraceFilename file for unobfuscated stacktrace
040: */
041: public static void convert(String rgsFilename,
042: String inTraceFilename, String outTraceFilename)
043: throws Exception {
044: File rgsFile = rgsFilename == null ? null : new File(
045: rgsFilename);
046: File inTraceFile = inTraceFilename == null ? null : new File(
047: inTraceFilename);
048: File outTraceFile = outTraceFilename == null ? null : new File(
049: outTraceFilename);
050:
051: // Script/log file must exist and be readable
052: if (rgsFile == null) {
053: throw new IllegalArgumentException("No log file specified.");
054: }
055: if (!rgsFile.exists()) {
056: throw new IllegalArgumentException(
057: "Log file specified does not exist.");
058: }
059: if (!rgsFile.canRead()) {
060: throw new IllegalArgumentException(
061: "Log file specified exists but cannot be read.");
062: }
063:
064: // Input stacktrace file must be readable if it exists
065: if (inTraceFile != null && !inTraceFile.exists()) {
066: throw new IllegalArgumentException(
067: "Input stacktrace file specified does not exist.");
068: }
069: if (inTraceFile != null && !inTraceFile.canRead()) {
070: throw new IllegalArgumentException(
071: "Input stacktrace file specified exists but cannot be read.");
072: }
073:
074: // Output stacktrace file must be writable if it exists
075: if (outTraceFile != null && outTraceFile.exists()
076: && !outTraceFile.canWrite()) {
077: throw new IllegalArgumentException(
078: "Output stacktrace file cannot be written to.");
079: }
080:
081: // Call the main entry point
082: RGtraceImpl.convert(rgsFile, inTraceFile, outTraceFile);
083: }
084:
085: /**
086: * Main entry point for the converter.
087: *
088: * @param rgsFile log-file from the obfuscation
089: * @param inTraceFile obfuscated stacktrace file
090: * @param outTraceFile file for unobfuscated stacktrace
091: */
092: public static void convert(File rgsFile, File inTraceFile,
093: File outTraceFile) throws Exception {
094: // Create the name mapping database, using the log file
095: ClassDB db = new ClassDB(rgsFile);
096:
097: // Open the output file
098: PrintStream out = null;
099: try {
100: out = outTraceFile == null ? System.out : new PrintStream(
101: new BufferedOutputStream(new FileOutputStream(
102: outTraceFile)));
103: // Convert the trace file to unobfuscated form
104: db.fromObfForTrace(inTraceFile, out);
105: out.flush();
106: } finally {
107: if (out != null) {
108: out.close();
109: }
110: }
111: }
112: }
|