summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/mapping/Mappings.java
diff options
context:
space:
mode:
authorGravatar jeff2014-09-03 00:20:36 -0400
committerGravatar jeff2014-09-03 00:20:36 -0400
commitb5338883d271779c335842c07047d60136316167 (patch)
tree006477e8c1ea0ade75ae8a9003abaf1978995fd7 /src/cuchaz/enigma/mapping/Mappings.java
parentfixed bug with export progress bar (diff)
downloadenigma-fork-b5338883d271779c335842c07047d60136316167.tar.gz
enigma-fork-b5338883d271779c335842c07047d60136316167.tar.xz
enigma-fork-b5338883d271779c335842c07047d60136316167.zip
big refactor to better model class/method mappings with no deobf name
Diffstat (limited to 'src/cuchaz/enigma/mapping/Mappings.java')
-rw-r--r--src/cuchaz/enigma/mapping/Mappings.java90
1 files changed, 62 insertions, 28 deletions
diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java
index f52094f..99cb85f 100644
--- a/src/cuchaz/enigma/mapping/Mappings.java
+++ b/src/cuchaz/enigma/mapping/Mappings.java
@@ -47,7 +47,10 @@ public class Mappings implements Serializable
47 for( ClassMapping classMapping : classes ) 47 for( ClassMapping classMapping : classes )
48 { 48 {
49 m_classesByObf.put( classMapping.getObfName(), classMapping ); 49 m_classesByObf.put( classMapping.getObfName(), classMapping );
50 m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ); 50 if( classMapping.getDeobfName() != null )
51 {
52 m_classesByDeobf.put( classMapping.getDeobfName(), classMapping );
53 }
51 } 54 }
52 } 55 }
53 56
@@ -68,23 +71,27 @@ public class Mappings implements Serializable
68 71
69 public Collection<ClassMapping> classes( ) 72 public Collection<ClassMapping> classes( )
70 { 73 {
71 assert( m_classesByObf.size() == m_classesByDeobf.size() ); 74 assert( m_classesByObf.size() >= m_classesByDeobf.size() );
72 return m_classesByObf.values(); 75 return m_classesByObf.values();
73 } 76 }
74 77
75 protected void addClassMapping( ClassMapping classMapping ) 78 public void addClassMapping( ClassMapping classMapping )
76 { 79 {
77 if( m_classesByObf.containsKey( classMapping.getObfName() ) ) 80 if( m_classesByObf.containsKey( classMapping.getObfName() ) )
78 { 81 {
79 throw new Error( "Already have mapping for " + classMapping.getObfName() ); 82 throw new Error( "Already have mapping for " + classMapping.getObfName() );
80 } 83 }
81 if( m_classesByDeobf.containsKey( classMapping.getDeobfName() ) ) 84 boolean obfWasAdded = m_classesByObf.put( classMapping.getObfName(), classMapping ) == null;
85 assert( obfWasAdded );
86 if( classMapping.getDeobfName() != null )
82 { 87 {
83 throw new Error( "Already have mapping for " + classMapping.getDeobfName() ); 88 if( m_classesByDeobf.containsKey( classMapping.getDeobfName() ) )
89 {
90 throw new Error( "Already have mapping for " + classMapping.getDeobfName() );
91 }
92 boolean deobfWasAdded = m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ) == null;
93 assert( deobfWasAdded );
84 } 94 }
85 m_classesByObf.put( classMapping.getObfName(), classMapping );
86 m_classesByDeobf.put( classMapping.getDeobfName(), classMapping );
87 assert( m_classesByObf.size() == m_classesByDeobf.size() );
88 } 95 }
89 96
90 public ClassMapping getClassByObf( ClassEntry entry ) 97 public ClassMapping getClassByObf( ClassEntry entry )
@@ -99,7 +106,7 @@ public class Mappings implements Serializable
99 106
100 public ClassMapping getClassByDeobf( ClassEntry entry ) 107 public ClassMapping getClassByDeobf( ClassEntry entry )
101 { 108 {
102 return getClassByObf( entry.getName() ); 109 return getClassByDeobf( entry.getName() );
103 } 110 }
104 111
105 public ClassMapping getClassByDeobf( String deobfName ) 112 public ClassMapping getClassByDeobf( String deobfName )
@@ -109,26 +116,52 @@ public class Mappings implements Serializable
109 116
110 public Translator getTranslator( TranslationIndex index, TranslationDirection direction ) 117 public Translator getTranslator( TranslationIndex index, TranslationDirection direction )
111 { 118 {
112 if( direction == TranslationDirection.Obfuscating ) 119 switch( direction )
113 { 120 {
114 // deobfuscate the index 121 case Deobfuscating:
115 index = new TranslationIndex( index ); 122
116 Map<String,String> renames = Maps.newHashMap(); 123 return new Translator( direction, m_classesByObf, index );
117 for( ClassMapping classMapping : classes() ) 124
118 { 125 case Obfuscating:
119 renames.put( classMapping.getObfName(), classMapping.getDeobfName() ); 126
120 for( ClassMapping innerClassMapping : classMapping.innerClasses() ) 127 // deobfuscate the index
128 index = new TranslationIndex( index );
129 Map<String,String> renames = Maps.newHashMap();
130 for( ClassMapping classMapping : classes() )
121 { 131 {
122 renames.put( innerClassMapping.getObfName(), innerClassMapping.getDeobfName() ); 132 if( classMapping.getDeobfName() != null )
133 {
134 renames.put( classMapping.getObfName(), classMapping.getDeobfName() );
135 }
136 for( ClassMapping innerClassMapping : classMapping.innerClasses() )
137 {
138 if( innerClassMapping.getDeobfName() != null )
139 {
140 renames.put( innerClassMapping.getObfName(), innerClassMapping.getDeobfName() );
141 }
142 }
123 } 143 }
124 } 144 index.renameClasses( renames );
125 index.renameClasses( renames ); 145
146 // fill in the missing deobf class entries with obf entries
147 Map<String,ClassMapping> classes = Maps.newHashMap();
148 for( ClassMapping classMapping : classes() )
149 {
150 if( classMapping.getDeobfName() != null )
151 {
152 classes.put( classMapping.getDeobfName(), classMapping );
153 }
154 else
155 {
156 classes.put( classMapping.getObfName(), classMapping );
157 }
158 }
159
160 return new Translator( direction, classes, index );
161
162 default:
163 throw new Error( "Invalid translation direction!" );
126 } 164 }
127 return new Translator(
128 direction,
129 direction.choose( m_classesByObf, m_classesByDeobf ),
130 index
131 );
132 } 165 }
133 166
134 public static Mappings newFromStream( InputStream in ) 167 public static Mappings newFromStream( InputStream in )
@@ -162,9 +195,10 @@ public class Mappings implements Serializable
162 { 195 {
163 if( classMapping.renameObfClass( oldObfName, newObfName ) ) 196 if( classMapping.renameObfClass( oldObfName, newObfName ) )
164 { 197 {
165 m_classesByObf.remove( oldObfName ); 198 boolean wasRemoved = m_classesByObf.remove( oldObfName ) != null;
166 m_classesByObf.put( newObfName, classMapping ); 199 assert( wasRemoved );
167 assert( m_classesByObf.size() == m_classesByDeobf.size() ); 200 boolean wasAdded = m_classesByObf.put( newObfName, classMapping ) == null;
201 assert( wasAdded );
168 } 202 }
169 } 203 }
170 } 204 }