1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
5b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu)
6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it
8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free
9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option)
10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version.
11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT
13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details.
16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along
18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc.,
19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard.obfuscate;
22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*;
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.ClassConstant;
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.ConstantVisitor;
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.editor.ConstantPoolEditor;
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.SimplifiedVisitor;
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.visitor.*;
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This <code>ClassVisitor</code> renames the class names and class member
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * names of the classes it visits, using names previously determined by the
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * obfuscator.
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @see ClassObfuscator
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @see MemberObfuscator
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class ClassRenamer
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoextends      SimplifiedVisitor
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimplements   ClassVisitor,
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             MemberVisitor,
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ConstantVisitor
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ClassVisitor.
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramClass(ProgramClass programClass)
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Rename this class.
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.thisClassConstantAccept(this);
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Rename the class members.
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.fieldsAccept(this);
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.methodsAccept(this);
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryClass(LibraryClass libraryClass)
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        libraryClass.thisClassName = ClassObfuscator.newClassName(libraryClass);
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Rename the class members.
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        libraryClass.fieldsAccept(this);
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        libraryClass.methodsAccept(this);
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for MemberVisitor.
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramMember(ProgramClass  programClass,
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                     ProgramMember programMember)
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Has the class member name changed?
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String name    = programMember.getName(programClass);
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String newName = MemberObfuscator.newMemberName(programMember);
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (newName != null &&
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            !newName.equals(name))
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            programMember.u2nameIndex =
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new ConstantPoolEditor(programClass).addUtf8Constant(newName);
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryMember(LibraryClass  libraryClass,
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                   LibraryMember libraryMember)
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String newName = MemberObfuscator.newMemberName(libraryMember);
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (newName != null)
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            libraryMember.name = newName;
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ConstantVisitor.
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Update the Class entry if required.
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String newName = ClassObfuscator.newClassName(clazz);
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (newName != null)
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Refer to a new Utf8 entry.
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            classConstant.u2nameIndex =
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newName);
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
110