From 8fa1741b621644ef84a9395a4c395d4ff3a89207 Mon Sep 17 00:00:00 2001 From: jeff Date: Sat, 23 Aug 2014 23:43:31 -0400 Subject: moved all classes from the default package into a package called "default" so they can be properly imported by other classes --- src/cuchaz/enigma/analysis/JarClassIterator.java | 45 ++++++++++++++---------- src/cuchaz/enigma/analysis/JarIndex.java | 40 ++++++++++++++------- 2 files changed, 55 insertions(+), 30 deletions(-) (limited to 'src/cuchaz/enigma/analysis') diff --git a/src/cuchaz/enigma/analysis/JarClassIterator.java b/src/cuchaz/enigma/analysis/JarClassIterator.java index cf6df80..6c9f124 100644 --- a/src/cuchaz/enigma/analysis/JarClassIterator.java +++ b/src/cuchaz/enigma/analysis/JarClassIterator.java @@ -28,6 +28,7 @@ import javassist.bytecode.Descriptor; import com.beust.jcommander.internal.Lists; import cuchaz.enigma.Constants; +import cuchaz.enigma.mapping.ClassEntry; public class JarClassIterator implements Iterator { @@ -35,14 +36,23 @@ public class JarClassIterator implements Iterator private Iterator m_iter; public JarClassIterator( JarFile jar ) - { - this( jar, getClassEntries( jar ) ); - } - - public JarClassIterator( JarFile jar, List entries ) { m_jar = jar; - m_iter = entries.iterator(); + + // get the jar entries that correspond to classes + List classEntries = Lists.newArrayList(); + Enumeration entries = m_jar.entries(); + while( entries.hasMoreElements() ) + { + JarEntry entry = entries.nextElement(); + + // is this a class file? + if( entry.getName().endsWith( ".class" ) ) + { + classEntries.add( entry ); + } + } + m_iter = classEntries.iterator(); } @Override @@ -79,19 +89,13 @@ public class JarClassIterator implements Iterator } } - // determine the class name (ie chop off the ".class") - String className = Descriptor.toJavaName( entry.getName().substring( 0, entry.getName().length() - ".class".length() ) ); - // get a javassist handle for the class + String className = Descriptor.toJavaName( getClassEntry( entry ).getName() ); ClassPool classPool = new ClassPool(); classPool.insertClassPath( new ByteArrayClassPath( className, bos.toByteArray() ) ); return classPool.get( className ); } - catch( IOException ex ) - { - throw new Error( "Unable to read class: " + entry.getName() ); - } - catch( NotFoundException ex ) + catch( IOException | NotFoundException ex ) { throw new Error( "Unable to load class: " + entry.getName() ); } @@ -103,9 +107,9 @@ public class JarClassIterator implements Iterator throw new UnsupportedOperationException(); } - public static List getClassEntries( JarFile jar ) + public static List getClassEntries( JarFile jar ) { - List classes = Lists.newArrayList(); + List classEntries = Lists.newArrayList(); Enumeration entries = jar.entries(); while( entries.hasMoreElements() ) { @@ -114,10 +118,10 @@ public class JarClassIterator implements Iterator // is this a class file? if( !entry.isDirectory() && entry.getName().endsWith( ".class" ) ) { - classes.add( entry ); + classEntries.add( getClassEntry( entry ) ); } } - return classes; + return classEntries; } public static Iterable classes( final JarFile jar ) @@ -131,4 +135,9 @@ public class JarClassIterator implements Iterator } }; } + + private static ClassEntry getClassEntry( JarEntry entry ) + { + return new ClassEntry( entry.getName().substring( 0, entry.getName().length() - ".class".length() ) ); + } } diff --git a/src/cuchaz/enigma/analysis/JarIndex.java b/src/cuchaz/enigma/analysis/JarIndex.java index 315a286..cdaca37 100644 --- a/src/cuchaz/enigma/analysis/JarIndex.java +++ b/src/cuchaz/enigma/analysis/JarIndex.java @@ -17,7 +17,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.jar.JarEntry; import java.util.jar.JarFile; import javassist.CannotCompileException; @@ -35,13 +34,12 @@ import javassist.expr.MethodCall; import javassist.expr.NewExpr; import com.google.common.collect.HashMultimap; -import com.google.common.collect.HashMultiset; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; -import com.google.common.collect.Multiset; import com.google.common.collect.Sets; +import cuchaz.enigma.bytecode.ClassRenamer; import cuchaz.enigma.mapping.ArgumentEntry; import cuchaz.enigma.mapping.BehaviorEntry; import cuchaz.enigma.mapping.ClassEntry; @@ -53,7 +51,7 @@ import cuchaz.enigma.mapping.Translator; public class JarIndex { - private Set m_obfClassNames; + private Set m_obfClassEntries; private Ancestries m_ancestries; private Multimap m_methodImplementations; private Multimap> m_behaviorReferences; @@ -64,7 +62,7 @@ public class JarIndex public JarIndex( ) { - m_obfClassNames = Sets.newHashSet(); + m_obfClassEntries = Sets.newHashSet(); m_ancestries = new Ancestries(); m_methodImplementations = HashMultimap.create(); m_behaviorReferences = HashMultimap.create(); @@ -77,15 +75,20 @@ public class JarIndex public void indexJar( JarFile jar ) { // pass 1: read the class names - for( JarEntry entry : JarClassIterator.getClassEntries( jar ) ) + for( ClassEntry classEntry : JarClassIterator.getClassEntries( jar ) ) { - String className = entry.getName().substring( 0, entry.getName().length() - 6 ); - m_obfClassNames.add( Descriptor.toJvmName( className ) ); + if( classEntry.isInDefaultPackage() ) + { + // move out of default package + classEntry = new ClassEntry( "default/" + classEntry.getName() ); + } + m_obfClassEntries.add( classEntry ); } // pass 2: index the types, methods for( CtClass c : JarClassIterator.classes( jar ) ) { + fixClass( c ); m_ancestries.addSuperclass( c.getName(), c.getClassFile().getSuperclass() ); for( CtBehavior behavior : c.getDeclaredBehaviors() ) { @@ -96,8 +99,10 @@ public class JarIndex // pass 2: index inner classes and anonymous classes for( CtClass c : JarClassIterator.classes( jar ) ) { + fixClass( c ); + String outerClassName = findOuterClass( c ); - if( outerClassName != null )// /* TEMP */ && false ) + if( outerClassName != null ) { String innerClassName = Descriptor.toJvmName( c.getName() ); m_innerClasses.put( outerClassName, innerClassName ); @@ -127,6 +132,17 @@ public class JarIndex renameClasses( renames ); } + private void fixClass( CtClass c ) + { + ClassEntry classEntry = new ClassEntry( Descriptor.toJvmName( c.getName() ) ); + if( classEntry.isInDefaultPackage() ) + { + // move class out of default package + classEntry = new ClassEntry( "default/" + classEntry.getName() ); + ClassRenamer.moveAllClassesOutOfDefaultPackage( c, "default" ); + } + } + private void indexBehavior( CtBehavior behavior ) { // get the method entry @@ -270,7 +286,7 @@ public class JarIndex else if( callerClasses.size() > 1 ) { // TEMP - System.out.println( "WARNING: Illegal class called by more than one class!" + callerClasses ); + System.out.println( "WARNING: Illegal constructor called by more than one class!" + callerClasses ); } } @@ -423,9 +439,9 @@ public class JarIndex return true; } - public Set getObfClassNames( ) + public Set getObfClassEntries( ) { - return m_obfClassNames; + return m_obfClassEntries; } public Ancestries getAncestries( ) -- cgit v1.2.3