01: /*
02: * ProGuard -- shrinking, optimization, obfuscation, and preverification
03: * of Java bytecode.
04: *
05: * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
06: *
07: * This program is free software; you can redistribute it and/or modify it
08: * under the terms of the GNU General Public License as published by the Free
09: * Software Foundation; either version 2 of the License, or (at your option)
10: * any later version.
11: *
12: * This program is distributed in the hope that it will be useful, but WITHOUT
13: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15: * more details.
16: *
17: * You should have received a copy of the GNU General Public License along
18: * with this program; if not, write to the Free Software Foundation, Inc.,
19: * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20: */
21: package proguard.obfuscate;
22:
23: import proguard.classfile.*;
24: import proguard.classfile.attribute.*;
25: import proguard.classfile.attribute.visitor.AttributeVisitor;
26: import proguard.classfile.editor.ConstantPoolEditor;
27: import proguard.classfile.util.SimplifiedVisitor;
28: import proguard.classfile.visitor.ClassVisitor;
29:
30: /**
31: * This ClassVisitor changes the name stored in the source file attributes
32: * and source dir attributes of the classes that it visits, if the
33: * attributes are present.
34: *
35: * @author Eric Lafortune
36: */
37: public class SourceFileRenamer extends SimplifiedVisitor implements
38: ClassVisitor, AttributeVisitor {
39: private final ConstantPoolEditor constantPoolEditor = new ConstantPoolEditor();
40:
41: private final String newSourceFileAttribute;
42:
43: /**
44: * Creates a new SourceFileRenamer.
45: * @param newSourceFileAttribute the new string to be put in the source file
46: * attributes.
47: */
48: public SourceFileRenamer(String newSourceFileAttribute) {
49: this .newSourceFileAttribute = newSourceFileAttribute;
50: }
51:
52: // Implementations for ClassVisitor.
53:
54: public void visitProgramClass(ProgramClass programClass) {
55: // Only visit the class attributes.
56: programClass.attributesAccept(this );
57: }
58:
59: public void visitLibraryClass(LibraryClass libraryClass) {
60: // Library classes don't have attributes.
61: }
62:
63: // Implementations for AttributeVisitor.
64:
65: public void visitAnyAttribute(Clazz clazz, Attribute attribute) {
66: }
67:
68: public void visitSourceFileAttribute(Clazz clazz,
69: SourceFileAttribute sourceFileAttribute) {
70: // Fix the source file attribute.
71: sourceFileAttribute.u2sourceFileIndex = constantPoolEditor
72: .addUtf8Constant((ProgramClass) clazz,
73: newSourceFileAttribute);
74: }
75:
76: public void visitSourceDirAttribute(Clazz clazz,
77: SourceDirAttribute sourceDirAttribute) {
78: // Fix the source file attribute.
79: sourceDirAttribute.u2sourceDirIndex = constantPoolEditor
80: .addUtf8Constant((ProgramClass) clazz,
81: newSourceFileAttribute);
82: }
83: }
|