summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/convert/ClassMapper.java
diff options
context:
space:
mode:
authorGravatar jeff2014-08-29 15:41:30 -0400
committerGravatar jeff2014-08-29 15:41:30 -0400
commit5ba8046f37b6998625a6ef4d61879950dbccfc4e (patch)
treef7d85c73cc64cc1aa4bb4de2873985a6614189b9 /src/cuchaz/enigma/convert/ClassMapper.java
parentstarted on mapping converter tool so we can update to newer Minecraft jars (diff)
downloadenigma-fork-5ba8046f37b6998625a6ef4d61879950dbccfc4e.tar.gz
enigma-fork-5ba8046f37b6998625a6ef4d61879950dbccfc4e.tar.xz
enigma-fork-5ba8046f37b6998625a6ef4d61879950dbccfc4e.zip
working on version conversion
Diffstat (limited to 'src/cuchaz/enigma/convert/ClassMapper.java')
-rw-r--r--src/cuchaz/enigma/convert/ClassMapper.java111
1 files changed, 81 insertions, 30 deletions
diff --git a/src/cuchaz/enigma/convert/ClassMapper.java b/src/cuchaz/enigma/convert/ClassMapper.java
index a0d5a3f..5a16a1c 100644
--- a/src/cuchaz/enigma/convert/ClassMapper.java
+++ b/src/cuchaz/enigma/convert/ClassMapper.java
@@ -12,17 +12,31 @@ package cuchaz.enigma.convert;
12 12
13import java.io.File; 13import java.io.File;
14import java.io.IOException; 14import java.io.IOException;
15import java.util.Collection;
16import java.util.List;
17import java.util.Map;
15import java.util.jar.JarFile; 18import java.util.jar.JarFile;
16 19
17import javassist.CtClass; 20import javassist.CtClass;
18 21
19import com.google.common.collect.HashMultiset; 22import com.beust.jcommander.internal.Lists;
20import com.google.common.collect.Multiset; 23import com.beust.jcommander.internal.Maps;
24import com.google.common.collect.ArrayListMultimap;
25import com.google.common.collect.Multimap;
21 26
22import cuchaz.enigma.analysis.JarClassIterator; 27import cuchaz.enigma.analysis.JarClassIterator;
28import cuchaz.enigma.mapping.ClassEntry;
23 29
24public class ClassMapper 30public class ClassMapper
25{ 31{
32 private int m_numSourceClasses;
33 private int m_numDestClasses;
34 private Multimap<ClassIdentity,ClassIdentity> m_sourceClasses;
35 private Multimap<ClassIdentity,ClassIdentity> m_destClasses;
36 private List<ClassIdentity> m_unmatchedSourceClasses;
37 private List<ClassIdentity> m_unmatchedDestClasses;
38 private Map<ClassEntry,ClassIdentity> m_sourceKeyIndex;
39
26 public static void main( String[] args ) 40 public static void main( String[] args )
27 throws IOException 41 throws IOException
28 { 42 {
@@ -30,44 +44,81 @@ public class ClassMapper
30 JarFile fromJar = new JarFile( new File( "input/1.8-pre1.jar" ) ); 44 JarFile fromJar = new JarFile( new File( "input/1.8-pre1.jar" ) );
31 JarFile toJar = new JarFile( new File( "input/1.8-pre2.jar" ) ); 45 JarFile toJar = new JarFile( new File( "input/1.8-pre2.jar" ) );
32 46
33 new ClassMapper( fromJar, toJar ); 47 ClassMapper mapper = new ClassMapper( fromJar, toJar );
48 System.out.println( String.format( "Mapped %d/%d source classes (%d unmatched) to %d/%d dest classes (%d unmatched)",
49 mapper.m_sourceClasses.size(), mapper.m_numSourceClasses, mapper.m_unmatchedSourceClasses.size(),
50 mapper.m_destClasses.size(), mapper.m_numDestClasses, mapper.m_unmatchedDestClasses.size()
51 ) );
34 } 52 }
35 53
36 public ClassMapper( JarFile a, JarFile b ) 54 public ClassMapper( JarFile sourceJar, JarFile destJar )
37 { 55 {
38 int numAClasses = JarClassIterator.getClassEntries( a ).size(); 56 m_numSourceClasses = JarClassIterator.getClassEntries( sourceJar ).size();
39 int numBClasses = JarClassIterator.getClassEntries( b ).size(); 57 m_numDestClasses = JarClassIterator.getClassEntries( destJar ).size();
40
41 // TEMP
42 System.out.println( "A classes: " + numAClasses );
43 System.out.println( "B classes: " + numBClasses );
44 58
45 // compute the a classes 59 // compute identities for the source classes
46 Multiset<ClassIdentity> aclasses = HashMultiset.create(); 60 m_sourceClasses = ArrayListMultimap.create();
47 for( CtClass c : JarClassIterator.classes( a ) ) 61 m_sourceKeyIndex = Maps.newHashMap();
62 for( CtClass c : JarClassIterator.classes( sourceJar ) )
48 { 63 {
49 ClassIdentity aclass = new ClassIdentity( c ); 64 ClassIdentity sourceClass = new ClassIdentity( c );
50 aclasses.add( aclass ); 65 m_sourceClasses.put( sourceClass, sourceClass );
66 m_sourceKeyIndex.put( sourceClass.getClassEntry(), sourceClass );
51 } 67 }
52 68
53 int numMatches = 0; 69 // match the dest classes to the source classes
54 70 m_destClasses = ArrayListMultimap.create();
55 // match the b classes to the a classes 71 m_unmatchedDestClasses = Lists.newArrayList();
56 for( CtClass c : JarClassIterator.classes( b ) ) 72 for( CtClass c : JarClassIterator.classes( destJar ) )
57 { 73 {
58 ClassIdentity bclass = new ClassIdentity( c ); 74 ClassIdentity destClass = new ClassIdentity( c );
59 if( aclasses.contains( bclass ) ) 75 Collection<ClassIdentity> matchedSourceClasses = m_sourceClasses.get( destClass );
76 if( matchedSourceClasses.isEmpty() )
77 {
78 // unmatched dest class
79 m_unmatchedDestClasses.add( destClass );
80 }
81 else
60 { 82 {
61 numMatches++; 83 ClassIdentity sourceClass = matchedSourceClasses.iterator().next();
84 m_destClasses.put( sourceClass, destClass );
62 } 85 }
63
64 // TEMP
65 //System.out.println( bclass );
66 } 86 }
67 87
68 // TEMP 88 // get unmatched source classes
69 System.out.println( String.format( "Class matches: %d/%d (missing %d)", 89 m_unmatchedSourceClasses = Lists.newArrayList();
70 numMatches, aclasses.size(), aclasses.size() - numMatches 90 for( ClassIdentity sourceClass : m_sourceClasses.keySet() )
71 ) ); 91 {
92 Collection<ClassIdentity> matchedSourceClasses = m_sourceClasses.get( sourceClass );
93 Collection<ClassIdentity> matchedDestClasses = m_destClasses.get( sourceClass );
94 if( matchedDestClasses.isEmpty() )
95 {
96 m_unmatchedSourceClasses.add( sourceClass );
97 }
98 else if( matchedDestClasses.size() > 1 )
99 {
100 // warn about identity collisions
101 System.err.println( String.format( "WARNING: identity collision:\n\tSource: %s\n\t Dest: %s",
102 getClassEntries( matchedSourceClasses ),
103 getClassEntries( matchedDestClasses )
104 ) );
105 }
106 }
107 }
108
109 public Map.Entry<Collection<ClassEntry>,Collection<ClassEntry>> getMapping( ClassEntry sourceEntry )
110 {
111 // TODO
112 return null;
113 }
114
115 private Collection<ClassEntry> getClassEntries( Collection<ClassIdentity> classes )
116 {
117 List<ClassEntry> entries = Lists.newArrayList();
118 for( ClassIdentity c : classes )
119 {
120 entries.add( c.getClassEntry() );
121 }
122 return entries;
72 } 123 }
73} 124}