11package de .upb .mike .amt .conflicresolution ;
22
3- import java .util .HashMap ;
4- import java .util .Map ;
3+ import java .util .Set ;
54
6- import de .foellix .aql .datastructure .Hash ;
7- import de .upb .mike .amt .SootObjHashed ;
85import de .upb .mike .amt .Data ;
96import de .upb .mike .amt .Log ;
10- import soot .RefType ;
117import soot .SootClass ;
128import soot .util .Chain ;
139
@@ -16,45 +12,40 @@ public class ConflictResolution {
1612
1713 private Chain <SootClass > sootClasses ;
1814
19- private Map <SootObjHashed , String > outerClassMap ;
20-
2115 public ConflictResolution (Chain <SootClass > initSootClasses ) {
2216 this .sootClasses = initSootClasses ;
23- this .outerClassMap = new HashMap <>();
2417 }
2518
26- public void resolveConflict (SootClass sootClass , Hash currentAppHash ) {
27- String originalName = sootClass .getName ();
19+ public void resolveConflictOuter (SootClass sootClass , Set <SootClass > innerClasses ) {
20+ // Resolve conflicts
21+ if (isConflicted (sootClass .getName ())) {
22+ final String oldName = sootClass .getName ();
23+ final String newName = makeUnique (sootClass .getName ());
24+ resolveConflictInner (innerClasses , oldName , newName );
25+ rename (sootClass , oldName , newName , false );
26+ }
2827
29- // Probably rename outer class
30- String rename = null ;
31- if (sootClass .hasOuterClass ()) {
32- String outerClassOriginalName = outerClassMap
33- .get (new SootObjHashed (sootClass .getOuterClass ().getName (), currentAppHash ));
34- rename = Data .getInstance ().getClassesChanged ()
35- .get (new SootObjHashed (outerClassOriginalName , currentAppHash ));
36- if (rename != null ) {
37- sootClass .setName (sootClass .getName ().replace (outerClassOriginalName , rename ));
38- sootClass .setRefType (RefType .v (sootClass .getName ()));
39- }
28+ // Add classes
29+ this .sootClasses .add (sootClass );
30+ for (final SootClass innerClass : innerClasses ) {
31+ this .sootClasses .add (innerClass );
4032 }
33+ }
4134
42- // Resolve conflict (if existent)
43- if (isConflicted (sootClass .getName ())) {
44- sootClass .setName (makeUnique (sootClass .getName ()));
45- sootClass .setRefType (RefType .v (sootClass .getName ()));
46- Data .getInstance ().getClassesChanged ().put (new SootObjHashed (originalName , currentAppHash ),
47- sootClass .getName ());
48- outerClassMap .put (new SootObjHashed (sootClass .getName (), currentAppHash ), originalName );
49- Log .log ("Class " + originalName + " renamed to " + sootClass .getName () + " (Innerclass mode)" ,
50- Log .LOG_LEVEL_DETAILED );
51- } else if (rename != null ) {
52- Data .getInstance ().getClassesChanged ().put (new SootObjHashed (originalName , currentAppHash ),
53- sootClass .getName ());
54- Log .log ("Class " + originalName + " renamed to " + sootClass .getName () + " (Outerclass mode)" ,
55- Log .LOG_LEVEL_DETAILED );
35+ private void resolveConflictInner (Set <SootClass > innerClasses , String outestClassOldName ,
36+ String outestClassNewName ) {
37+ for (final SootClass sootClass : innerClasses ) {
38+ final String oldName = new String (sootClass .getName ());
39+ final String newName = sootClass .getName ().replace (outestClassOldName , outestClassNewName );
40+ rename (sootClass , oldName , newName , true );
5641 }
57- sootClasses .add (sootClass );
42+ }
43+
44+ private void rename (SootClass sootClass , String oldName , String newName , boolean innerClass ) {
45+ sootClass .rename (newName );
46+ Data .getInstance ().getClassesChanged ().put (Data .getInstance ().getSootClassMap ().get (sootClass ), newName );
47+ Log .log ("Class \" " + oldName + "\" renamed to \" " + newName + "\" (" + (innerClass ? "inner" : "outer" )
48+ + " class)" , Log .LOG_LEVEL_DETAILED );
5849 }
5950
6051 private String makeUnique (String name ) {
@@ -67,8 +58,8 @@ private String makeUnique(String name) {
6758 }
6859
6960 private boolean isConflicted (String sootClassName ) {
70- for (SootClass conflictClass : sootClasses ) {
71- String conflictClassName = conflictClass .getName ();
61+ for (final SootClass conflictClass : this . sootClasses ) {
62+ final String conflictClassName = conflictClass .getName ();
7263 if (sootClassName .equals (conflictClassName )) {
7364 return true ;
7465 }
0 commit comments