001: /* ===========================================================================
002: * $RCSfile: RGpatchImpl.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 patch utility. Creates a patch Jar from a full
028: * obfuscation run.
029: *
030: * @author Mark Welsh
031: */
032: public class RGpatchImpl {
033: // Class Methods ---------------------------------------------------------
034: /**
035: * Main entry point for the patch generator.
036: *
037: * @param inFile the full, obfuscated JAR
038: * @param outFile a writable file for obfuscated patch JAR
039: * @param rgsFile log-file from the obfuscation.
040: * @param listFile list of files to include in the patch (unobfuscated names)
041: */
042: public static void patch(String inFilename, String outFilename,
043: String rgsFilename, String listFilename) throws Exception {
044: if (inFilename == null || outFilename == null
045: || rgsFilename == null || listFilename == null) {
046: throw new IllegalArgumentException(
047: "Invalid number of arguments.");
048: }
049: File inFile = new File(inFilename);
050: File outFile = new File(outFilename);
051: File rgsFile = new File(rgsFilename);
052: File listFile = new File(listFilename);
053:
054: // Input JAR file must exist and be readable
055: if (!inFile.exists()) {
056: throw new IllegalArgumentException(
057: "JAR specified for obfuscation does not exist.");
058: }
059: if (!inFile.canRead()) {
060: throw new IllegalArgumentException(
061: "JAR specified for obfuscation exists but cannot be read.");
062: }
063:
064: // Output JAR file must be writable if it exists
065: if (outFile.exists() && !outFile.canWrite()) {
066: throw new IllegalArgumentException(
067: "Output JAR file cannot be written to.");
068: }
069:
070: // Script/log file must exist and be readable
071: if (!rgsFile.exists()) {
072: throw new IllegalArgumentException(
073: "Log file specified does not exist.");
074: }
075: if (!rgsFile.canRead()) {
076: throw new IllegalArgumentException(
077: "Log file specified exists but cannot be read.");
078: }
079:
080: // List file must exist and be readable
081: if (!listFile.exists()) {
082: throw new IllegalArgumentException(
083: "List specified does not exist.");
084: }
085: if (!listFile.canRead()) {
086: throw new IllegalArgumentException(
087: "List specified exists but cannot be read.");
088: }
089:
090: // Call the main entry point on the patch generator.
091: RGpatchImpl.patch(inFile, outFile, rgsFile, listFile);
092: }
093:
094: /**
095: * Main entry point for the patch generator.
096: *
097: * @param inFile the full, obfuscated JAR
098: * @param outFile a writable file for obfuscated patch JAR
099: * @param rgsFile log-file from the obfuscation.
100: * @param listFile list of files to include in the patch (unobfuscated names)
101: */
102: public static void patch(File inFile, File outFile, File rgsFile,
103: File listFile) throws Exception {
104: // Create the name mapping database, using the log file
105: ClassDB db = new ClassDB(rgsFile);
106:
107: // Convert the list file to obfuscated form, and initialize the
108: // patch generator
109: PatchMaker pm = new PatchMaker(db.toObf(listFile));
110:
111: // Copy the obfuscated Jar to a patch Jar, adding only classes (and
112: // all of their inner classes) known to the PatchMaker
113: pm.makePatch(inFile, outFile);
114: }
115: }
|