/******************************************************************************* * Copyright (c) 2015 Jeff Martin. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public * License v3.0 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl.html * * Contributors: * Jeff Martin - initial API and implementation ******************************************************************************/ package cuchaz.enigma.mapping; import javassist.CtBehavior; import javassist.CtClass; import javassist.CtConstructor; import javassist.CtField; import javassist.CtMethod; import javassist.bytecode.Descriptor; import javassist.expr.ConstructorCall; import javassist.expr.FieldAccess; import javassist.expr.MethodCall; import javassist.expr.NewExpr; import cuchaz.enigma.analysis.JarIndex; public class EntryFactory { public static ClassEntry getClassEntry(CtClass c) { return new ClassEntry(Descriptor.toJvmName(c.getName())); } public static ClassEntry getObfClassEntry(JarIndex jarIndex, ClassMapping classMapping) { ClassEntry obfClassEntry = new ClassEntry(classMapping.getObfFullName()); return obfClassEntry.buildClassEntry(jarIndex .getObfClassChain(obfClassEntry)); } private static ClassEntry getObfClassEntry(ClassMapping classMapping) { return new ClassEntry(classMapping.getObfFullName()); } public static ClassEntry getDeobfClassEntry(ClassMapping classMapping) { return new ClassEntry(classMapping.getDeobfName()); } public static ClassEntry getSuperclassEntry(CtClass c) { return new ClassEntry(Descriptor.toJvmName(c.getClassFile() .getSuperclass())); } public static FieldEntry getFieldEntry(CtField field) { return new FieldEntry(getClassEntry(field.getDeclaringClass()), field.getName(), new Type(field.getFieldInfo().getDescriptor())); } public static FieldEntry getFieldEntry(FieldAccess call) { return new FieldEntry(new ClassEntry(Descriptor.toJvmName(call .getClassName())), call.getFieldName(), new Type( call.getSignature())); } public static FieldEntry getFieldEntry(String className, String name, String type) { return new FieldEntry(new ClassEntry(className), name, new Type(type)); } public static FieldEntry getObfFieldEntry(ClassMapping classMapping, FieldMapping fieldMapping) { return new FieldEntry(getObfClassEntry(classMapping), fieldMapping.getObfName(), fieldMapping.getObfType()); } public static MethodEntry getMethodEntry(CtMethod method) { return new MethodEntry(getClassEntry(method.getDeclaringClass()), method.getName(), new Signature(method.getMethodInfo() .getDescriptor())); } public static MethodEntry getMethodEntry(MethodCall call) { return new MethodEntry(new ClassEntry(Descriptor.toJvmName(call .getClassName())), call.getMethodName(), new Signature( call.getSignature())); } public static ConstructorEntry getConstructorEntry(CtConstructor constructor) { if(constructor.isClassInitializer()) return new ConstructorEntry( getClassEntry(constructor.getDeclaringClass())); else return new ConstructorEntry( getClassEntry(constructor.getDeclaringClass()), new Signature( constructor.getMethodInfo().getDescriptor())); } public static ConstructorEntry getConstructorEntry(ConstructorCall call) { return new ConstructorEntry(new ClassEntry(Descriptor.toJvmName(call .getClassName())), new Signature(call.getSignature())); } public static ConstructorEntry getConstructorEntry(NewExpr call) { return new ConstructorEntry(new ClassEntry(Descriptor.toJvmName(call .getClassName())), new Signature(call.getSignature())); } public static BehaviorEntry getBehaviorEntry(CtBehavior behavior) { if(behavior instanceof CtMethod) return getMethodEntry((CtMethod)behavior); else if(behavior instanceof CtConstructor) return getConstructorEntry((CtConstructor)behavior); throw new Error("behavior is neither Method nor Constructor!"); } public static BehaviorEntry getBehaviorEntry(String className, String behaviorName, String behaviorSignature) { return getBehaviorEntry(new ClassEntry(className), behaviorName, new Signature(behaviorSignature)); } public static BehaviorEntry getBehaviorEntry(String className, String behaviorName) { return getBehaviorEntry(new ClassEntry(className), behaviorName); } public static BehaviorEntry getBehaviorEntry(String className) { return new ConstructorEntry(new ClassEntry(className)); } public static BehaviorEntry getBehaviorEntry(ClassEntry classEntry, String behaviorName, Signature behaviorSignature) { if(behaviorName.equals("<init>")) return new ConstructorEntry(classEntry, behaviorSignature); else if(behaviorName.equals("<clinit>")) return new ConstructorEntry(classEntry); else return new MethodEntry(classEntry, behaviorName, behaviorSignature); } public static BehaviorEntry getBehaviorEntry(ClassEntry classEntry, String behaviorName) { if(behaviorName.equals("<clinit>")) return new ConstructorEntry(classEntry); else throw new IllegalArgumentException( "Only class initializers don't have signatures"); } public static BehaviorEntry getObfBehaviorEntry(ClassEntry classEntry, MethodMapping methodMapping) { return getBehaviorEntry(classEntry, methodMapping.getObfName(), methodMapping.getObfSignature()); } public static BehaviorEntry getObfBehaviorEntry(ClassMapping classMapping, MethodMapping methodMapping) { return getObfBehaviorEntry(getObfClassEntry(classMapping), methodMapping); } }