// This product is provided under the terms of EPL (Eclipse Public License) // version 1.0. // // The full license text can be read from: http://www.eclipse.org/org/documents/epl-v10.php package org.dtangler.javaengine.types; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.dtangler.core.dependencies.Dependable; public class JavaClass { private static final String OBJECT = "java.lang.Object"; private final Map<String, Integer> dependencies = new HashMap(); private final String className; private boolean isAbstract; private String sourceFileName; private int contentCount = 1; private String location = ""; public JavaClass(String className) { this.className = className; } public void setAbstract(boolean b) { isAbstract = b; } public void setSourceFile(String sourceFile) { sourceFileName = sourceFile; } public void addDependency(String className) { if (className.equals(this.className)) return; // offcourse we depend on ourselves. if (className.equals(OBJECT)) return; // Every class depends on Object String baseClassName = getBaseClassName(className); Integer weight = dependencies.get(baseClassName); if (weight == null) { dependencies.put(baseClassName, 1); } else { dependencies.put(baseClassName, ++weight); } } public String getFullName() { return className; } public String getBaseClassName() { return getBaseClassName(getFullName()); } private String getBaseClassName(String fullName) { if (!isInnerClass(fullName)) return fullName; return fullName.split("\\$")[0]; } public boolean isAbstract() { return isAbstract; } public Map<String, Integer> getDependencies() { return dependencies; } public String getSourceFileName() { return sourceFileName; } public String getName() { int lastDotIndex = className.lastIndexOf("."); if (lastDotIndex >= 0 && lastDotIndex < className.length()) return className.substring(lastDotIndex + 1); return className; } public String getPackage() { int lastDotIndex = className.lastIndexOf("."); if (lastDotIndex >= 0 && lastDotIndex < className.length()) return className.substring(0, lastDotIndex); return "default"; } public void setLocation(String location) { this.location = location; } public String getLocation() { return location; } @Override public boolean equals(Object obj) { if (!(obj instanceof JavaClass)) return false; JavaClass other = (JavaClass) obj; return getFullName().equals(other.getFullName()); } @Override public int hashCode() { return getFullName().hashCode(); } @Override public String toString() { return String.format("JavaClass[%s]", getFullName()); } public Dependable toDependable() { String fullName = getLocation() + ": " + getPackage() + "." + getName(); return new Dependable(JavaScope.classes, fullName, getName(), contentCount); } public boolean isInnerClass() { return isInnerClass(getFullName()); } private boolean isInnerClass(String fullName) { return fullName.contains("$"); } public void addInnerClass(JavaClass innerClass) { for (String dep : innerClass.getDependencies().keySet()) addDependency(dep); contentCount++; } public void addInnerClasses(Set<JavaClass> innerClasses) { for (JavaClass clazz : innerClasses) addInnerClass(clazz); } }