package jdepend.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import jdepend.metadata.InvokeItem;
import jdepend.metadata.Method;
import jdepend.model.component.VirtualComponent;
import jdepend.model.result.AnalysisResult;
import jdepend.model.util.RelationCreator;
public class JavaClassWrapper {
private JavaClassUnit javaClass;
private transient Collection<JavaClassUnit> invokeClasses;
public JavaClassWrapper(JavaClassUnit javaClass) {
super();
this.javaClass = javaClass;
}
public synchronized Collection<JavaClassUnit> getInvokeClasses() {
if (this.invokeClasses == null) {
this.invokeClasses = new HashSet<JavaClassUnit>();
this.collectInvokeClasses(javaClass, invokeClasses);
}
return this.invokeClasses;
}
public Collection<Relation> getRelations() {
Collection<Component> components = new ArrayList<Component>();
VirtualComponent javaClassComponent = new VirtualComponent(javaClass);
components.add(javaClassComponent);
Collection<Component> componentCas = new ArrayList<Component>();
for (JavaClassUnit relJavaClass : javaClass.getCaList()) {
javaClassComponent = new VirtualComponent(relJavaClass);
componentCas.add(javaClassComponent);
}
Collection<Component> componentCes = new ArrayList<Component>();
for (JavaClassUnit relJavaClass : javaClass.getCeList()) {
javaClassComponent = new VirtualComponent(relJavaClass);
componentCes.add(javaClassComponent);
}
Collection<Relation> relations = new ArrayList<Relation>();
relations.addAll(new RelationCreator().create(componentCas, components));
relations.addAll(new RelationCreator().create(components, componentCes));
return relations;
}
private void collectInvokeClasses(JavaClassUnit javaClass, Collection<JavaClassUnit> invokeClasses) {
AnalysisResult result = javaClass.getResult();
JavaClassUnit invokeClass;
for (Method method : javaClass.getJavaClass().getSelfMethods()) {
for (InvokeItem invokeItem : method.getInvokeItems()) {
invokeClass = result.getTheClass(invokeItem.getCallee().getJavaClass().getId());
if (!invokeClasses.contains(invokeClass)) {
invokeClasses.add(invokeClass);
collectInvokeClasses(invokeClass, invokeClasses);
}
}
}
}
}