package jdepend.metadata; import java.io.IOException; import java.io.Serializable; import java.util.Collection; import java.util.HashSet; import java.util.UUID; import jdepend.framework.exception.JDependException; /** * 两个JavaClass之间的关联项信息 * * @author <b>Abner</b> * */ public class JavaClassRelationItem implements Serializable { /** * */ private static final long serialVersionUID = -6332298811666212021L; private String id; private transient JavaClass target = null;// 目标javaclass private transient JavaClass source = null;// 源javaClass private String targetJavaClassPlace = null;// 序列化和反序列化时使用 private String targetJavaClass = null;// 序列化和反序列化时使用 private String sourceJavaClassPlace = null;// 序列化和反序列化时使用 private String sourceJavaClass = null;// 序列化和反序列化时使用 private transient JavaClassRelationType type = null;// 关联类型 private String typeName = null; // 序列化和反序列化时使用 public JavaClassRelationItem() { super(); this.id = UUID.randomUUID().toString(); } /** * 得到该关联项关联强度 * * @return */ public float getRelationIntensity() { return this.type.getIntensity(); } public JavaClass getTarget() { return target; } public void setTarget(JavaClass target) { this.target = target; } public JavaClassRelationType getType() { return type; } public String getTargetJavaClass() { return targetJavaClass; } public String getSourceJavaClass() { return sourceJavaClass; } public void setType(JavaClassRelationType type) { this.type = type; } public JavaClass getSource() { return source; } public void setSource(JavaClass source) { this.source = source; } public void setTargetJavaClass(String targetJavaClass) { this.targetJavaClass = targetJavaClass; } public void setSourceJavaClass(String sourceJavaClass) { this.sourceJavaClass = sourceJavaClass; } public String getTargetJavaClassPlace() { return targetJavaClassPlace; } public String getSourceJavaClassPlace() { return sourceJavaClassPlace; } public void setTargetJavaClassPlace(String targetJavaClassPlace) { this.targetJavaClassPlace = targetJavaClassPlace; } public void setSourceJavaClassPlace(String sourceJavaClassPlace) { this.sourceJavaClassPlace = sourceJavaClassPlace; } public String getTypeName() { return typeName; } public void setTypeName(String typeName) { this.typeName = typeName; } public String getId() { return id; } public void setId(String id) { this.id = id; } public Collection<InvokeItem> getInvokeDetail() { Collection<InvokeItem> invokedItems = new HashSet<InvokeItem>(); if (this.type.invokeRelated()) { for (Method method : target.getMethods()) { for (InvokeItem invokeItem : method.getInvokedItems()) { if (invokeItem.getCaller().getJavaClass().equals(source)) { invokedItems.add(invokeItem); } } } } return invokedItems; } public JavaClassRelationItem clone() { JavaClassRelationItem newItem = new JavaClassRelationItem(); newItem.id = this.id; newItem.type = this.type; newItem.typeName = this.type.getName(); newItem.sourceJavaClassPlace = this.source.getPlace(); newItem.sourceJavaClass = this.source.getName(); newItem.targetJavaClassPlace = this.target.getPlace(); newItem.targetJavaClass = this.target.getName(); return newItem; } /** * 创建一个以宿主类为current的relationItem * * @return * @throws JDependException */ public JavaClassRelationItem clone2() { if (!this.source.isInnerClass()) { return this; } else { JavaClass hostClass = this.source.getHostClass(); if (hostClass != null) { JavaClassRelationItem newItem = new JavaClassRelationItem(); newItem.type = this.type; newItem.typeName = this.typeName; newItem.sourceJavaClassPlace = hostClass.getPlace(); newItem.sourceJavaClass = hostClass.getName(); newItem.source = hostClass; newItem.targetJavaClassPlace = this.targetJavaClassPlace; newItem.targetJavaClass = this.targetJavaClass; newItem.target = this.target; return newItem; } else { return this; } } } private void writeObject(java.io.ObjectOutputStream out) throws IOException { // 准备序列化数据 if (this.target != null) { this.targetJavaClassPlace = this.target.getPlace(); this.targetJavaClass = this.target.getName(); } if (this.source != null) { this.sourceJavaClassPlace = this.source.getPlace(); this.sourceJavaClass = this.source.getName(); } if (this.type != null) { this.typeName = this.type.getName(); } out.defaultWriteObject();// 序列化对象 } @Override public String toString() { return "JavaClassRelationItem [source=" + source.getName() + ", target=" + target.getName() + ", type=" + type + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; if (source != null && target != null && type != null) { result = prime * result + ((source == null) ? 0 : source.hashCode()); result = prime * result + ((target == null) ? 0 : target.hashCode()); result = prime * result + ((type == null) ? 0 : type.hashCode()); } else { result = prime * result + ((sourceJavaClassPlace == null) ? 0 : sourceJavaClassPlace.hashCode()); result = prime * result + ((sourceJavaClass == null) ? 0 : sourceJavaClass.hashCode()); result = prime * result + ((targetJavaClassPlace == null) ? 0 : targetJavaClassPlace.hashCode()); result = prime * result + ((targetJavaClass == null) ? 0 : targetJavaClass.hashCode()); result = prime * result + ((typeName == null) ? 0 : typeName.hashCode()); } return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; JavaClassRelationItem other = (JavaClassRelationItem) obj; if (source != null && target != null && type != null) { if (source == null) { if (other.source != null) return false; } else if (!source.equals(other.source)) return false; if (target == null) { if (other.target != null) return false; } else if (!target.equals(other.target)) return false; if (type == null) { if (other.type != null) return false; } else if (!type.equals(other.type)) return false; } else { if (sourceJavaClassPlace == null) { if (other.sourceJavaClassPlace != null) return false; } else if (!sourceJavaClassPlace.equals(other.sourceJavaClassPlace)) return false; if (sourceJavaClass == null) { if (other.sourceJavaClass != null) return false; } else if (!sourceJavaClass.equals(other.sourceJavaClass)) return false; if (targetJavaClassPlace == null) { if (other.targetJavaClassPlace != null) return false; } else if (!targetJavaClassPlace.equals(other.targetJavaClassPlace)) return false; if (targetJavaClass == null) { if (other.targetJavaClass != null) return false; } else if (!targetJavaClass.equals(other.targetJavaClass)) return false; if (typeName == null) { if (other.typeName != null) return false; } else if (!typeName.equals(other.typeName)) return false; } return true; } }