1
1
package org .tudo .sse .model ;
2
2
3
+ import org .apache .logging .log4j .LogManager ;
4
+ import org .apache .logging .log4j .Logger ;
5
+ import org .tudo .sse .Main ;
3
6
import org .tudo .sse .model .index .IndexInformation ;
4
- import org .tudo .sse .model .jar .JarInformation ;
7
+ import org .tudo .sse .model .jar .* ;
5
8
import org .tudo .sse .model .pom .PomInformation ;
9
+ import org .tudo .sse .resolution .JarResolutionException ;
10
+ import org .tudo .sse .resolution .JarResolver ;
11
+
12
+ import java .util .ArrayList ;
13
+ import java .util .HashMap ;
14
+ import java .util .List ;
15
+ import java .util .Map ;
6
16
7
17
/**
8
18
* This class holds all the artifact information. For each artifact index, jar, and pom information can be defined.
@@ -13,6 +23,8 @@ public class Artifact {
13
23
* The identifier object for the artifact.
14
24
*/
15
25
public final ArtifactIdent ident ;
26
+ public static final Logger log = LogManager .getLogger (Artifact .class );
27
+
16
28
/**
17
29
* A secondary identifier, for if its pom information has been moved on the maven central repository.
18
30
*/
@@ -75,4 +87,136 @@ public void setJarInformation(JarInformation jarInformation) {
75
87
this .jarInformation = jarInformation ;
76
88
}
77
89
90
+
91
+ public Map <String , ClassFileNode > buildTypeStructure () {
92
+ Map <String , ClassFileNode > roots = new HashMap <>();
93
+ roots .put ("java/lang/Object" , new NotFoundNode (new ObjType (0 , "java/lang/Object" , "java/lang" )));
94
+ if (jarInformation != null ) {
95
+ Map <String , List <ClassFile >> packages = jarInformation .getPackages ();
96
+ Map <String , Artifact > depArts = new HashMap <>();
97
+
98
+ if (pomInformation != null ) {
99
+ JarResolver resolver = new JarResolver ();
100
+ for (Artifact artifact : pomInformation .getEffectiveTransitiveDependencies ()) {
101
+ try {
102
+ artifact .setJarInformation (resolver .parseJar (artifact .getIdent ()).getJarInformation ());
103
+ depArts .put (artifact .getIdent ().getGroupID () + ":" + artifact .getIdent ().getArtifactID (), artifact );
104
+ } catch (JarResolutionException e ) {
105
+ log .error (e );
106
+ }
107
+ }
108
+ }
109
+
110
+ for (Map .Entry <String , List <ClassFile >> classes : packages .entrySet ()) {
111
+ for (ClassFile clase : classes .getValue ()) {
112
+ resolveNode (roots , clase , packages , depArts );
113
+ }
114
+ }
115
+ }
116
+ return roots ;
117
+ }
118
+
119
+ private ClassFileNode resolveNode (Map <String , ClassFileNode > root , ClassFile clase , Map <String , List <ClassFile >> packages , Map <String , Artifact > depArts ) {
120
+ ClassFileNode node = new FoundInfoNode (clase .getAccessFlags (), clase .getThistype (), clase .getVersion ());
121
+
122
+ if (clase .getSuperType () != null ) {
123
+ resolveSuperClass (root , node , clase , packages , depArts );
124
+ }
125
+
126
+ if (!clase .getInterfaceTypes ().isEmpty ()) {
127
+ resolveInterfaces (root , node , clase , packages , depArts );
128
+ }
129
+
130
+ return node ;
131
+ }
132
+
133
+ private void resolveSuperClass (Map <String , ClassFileNode > roots , ClassFileNode node , ClassFile clase , Map <String , List <ClassFile >> packages , Map <String , Artifact > depArts ) {
134
+ String packName = clase .getSuperType ().getPackageName ();
135
+
136
+ //Check if the superclass can be found in the root map
137
+ if (roots .containsKey (clase .getSuperType ().getFqn ())) {
138
+ node .setSuperClass (roots .get (clase .getSuperType ().getFqn ()));
139
+ roots .get (clase .getSuperType ().getFqn ()).addChild (node );
140
+ }
141
+ //Check if
142
+ else if (packages .containsKey (packName )) {
143
+ List <ClassFile > toLookThrough = packages .get (packName );
144
+ for (ClassFile cls : toLookThrough ) {
145
+ if (cls .getThistype ().getFqn ().equals (clase .getSuperType ().getFqn ())) {
146
+ node .setSuperClass (resolveNode (roots , cls , packages , depArts ));
147
+ node .getSuperClass ().addChild (node );
148
+ break ;
149
+ }
150
+ }
151
+ } else {
152
+ boolean found = false ;
153
+
154
+ for (Map .Entry <String , Artifact > entry : depArts .entrySet ()) {
155
+ if (entry .getValue ().getJarInformation ().getPackages ().containsKey (packName )) {
156
+ for (ClassFile depClass : entry .getValue ().getJarInformation ().getPackages ().get (packName )) {
157
+ if (depClass .getThistype ().getFqn ().equals (clase .getSuperType ().getFqn ())) {
158
+ found = true ;
159
+ node .setSuperClass (resolveNode (roots , depClass , entry .getValue ().getJarInformation ().getPackages (), depArts ));
160
+ node .getSuperClass ().addChild (node );
161
+ break ;
162
+ }
163
+ }
164
+ if (found ) {
165
+ break ;
166
+ }
167
+ }
168
+ }
169
+
170
+ //add a new root to the map
171
+ if (!found ) {
172
+ node .setSuperClass (new NotFoundNode (clase .getSuperType ()));
173
+ node .getSuperClass ().addChild (node );
174
+ roots .put (node .getSuperClass ().getThistype ().getFqn (), node .getSuperClass ());
175
+ }
176
+ }
177
+ }
178
+
179
+ private void resolveInterfaces (Map <String , ClassFileNode > roots , ClassFileNode node , ClassFile clase , Map <String , List <ClassFile >> packages , Map <String , Artifact > depArts ) {
180
+ for (ObjType itfe : clase .getInterfaceTypes ()) {
181
+ String packName = itfe .getPackageName ();
182
+
183
+ if (packages .containsKey (packName )) {
184
+ List <ClassFile > toLookThrough = packages .get (packName );
185
+ for (ClassFile cls : toLookThrough ) {
186
+ if (cls .getThistype ().getFqn ().equals (itfe .getFqn ())) {
187
+ ClassFileNode resolved = resolveNode (roots , cls , packages , depArts );
188
+ resolved .addChild (node );
189
+ ((FoundInfoNode ) node ).addInterfaceNode (resolved );
190
+ break ;
191
+ }
192
+ }
193
+ } else {
194
+ boolean found = false ;
195
+
196
+ for (Map .Entry <String , Artifact > entry : depArts .entrySet ()) {
197
+ if (entry .getValue ().getJarInformation ().getPackages ().containsKey (packName )) {
198
+ for (ClassFile depClass : entry .getValue ().getJarInformation ().getPackages ().get (packName )) {
199
+ if (depClass .getThistype ().getFqn ().equals (itfe .getFqn ())) {
200
+ found = true ;
201
+ ClassFileNode resolved = resolveNode (roots , depClass , entry .getValue ().getJarInformation ().getPackages (), depArts );
202
+ resolved .addChild (node );
203
+ ((FoundInfoNode ) node ).addInterfaceNode (resolved );
204
+ break ;
205
+ }
206
+ }
207
+ if (found ) {
208
+ break ;
209
+ }
210
+ }
211
+ }
212
+
213
+ if (!found ) {
214
+ ClassFileNode notFound = new NotFoundNode (itfe );
215
+ ((FoundInfoNode ) node ).addInterfaceNode (notFound );
216
+ notFound .addChild (node );
217
+ }
218
+ }
219
+ }
220
+ }
221
+
78
222
}
0 commit comments