package jdepend.model.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jdepend.framework.exception.JDependException;
import jdepend.metadata.JavaClass;
import jdepend.metadata.JavaPackage;
import jdepend.metadata.util.JavaClassCollection;
import jdepend.metadata.util.JavaClassUtil;
import jdepend.model.Component;
import jdepend.model.JavaClassUnit;
import jdepend.model.result.AnalysisRunningContext;
public final class CopyUtil {
private List<Component> targets = new ArrayList<Component>();
private Map<String, JavaClassUnit> javaClasses = new HashMap<String, JavaClassUnit>();
public List<Component> copy(AnalysisRunningContext runningContext, List<Component> components) {
// 创建JavaClassUnit
for (Component component : components) {
for (JavaClassUnit javaClass : component.getClasses()) {
if (javaClasses.get(javaClass.getId()) == null) {
newJavaClass(javaClass);
}
}
}
// 生成JavaClasses
Map<String, JavaClass> newJavaClasses = new HashMap<String, JavaClass>();
for (String id : javaClasses.keySet()) {
newJavaClasses.put(id, javaClasses.get(id).getJavaClass());
}
JavaClassCollection jClasses = new JavaClassCollection(runningContext.getProfileFacade()
.getJavaClassRelationItemProfile().getJavaClassRelationTypes(), newJavaClasses.values());
// 补充JavaClassRelationItem的Current和Depend
JavaClassUtil.supplyJavaClassRelationItem(jClasses);
// 将JavaClassDetail中的字符串信息填充为对象引用
JavaClassUtil.supplyJavaClassDetail(jClasses);
// 创建JavaPackage
for (Component component : components) {
for (JavaPackage javaPackage : component.getJavaPackages()) {
try {
javaPackage.clone(newJavaClasses);
} catch (JDependException e) {
e.printStackTrace();
}
}
}
// 创建Component
for (Component component : components) {
try {
targets.add(component.clone(javaClasses));
} catch (JDependException e) {
e.printStackTrace();
}
}
return targets;
}
private JavaClassUnit newJavaClass(JavaClassUnit javaClass) {
JavaClassUnit newJavaClass = javaClasses.get(javaClass.getId());
if (newJavaClass == null) {
newJavaClass = javaClass.clone();
javaClasses.put(newJavaClass.getId(), newJavaClass);
// 添加内部类
for (JavaClassUnit innerClass : newJavaClass.getInnerClassUnits()) {
javaClasses.put(innerClass.getId(), innerClass);
}
}
return newJavaClass;
}
}