gr.uom.java.xmi.UMLClass Maven / Gradle / Ivy
package gr.uom.java.xmi;
import gr.uom.java.xmi.diff.StringDistance;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class UMLClass extends UMLAbstractClass implements Comparable, Serializable, LocationInfoProvider {
private String qualifiedName;
private String sourceFile;
private String sourceFolder;
private Visibility visibility;
private boolean isFinal;
private boolean isStatic;
private boolean isAbstract;
private boolean isInterface;
private boolean isEnum;
private boolean isAnnotation;
private boolean isRecord;
private boolean topLevel;
private List typeParameters;
private UMLJavadoc javadoc;
private UMLJavadoc packageDeclarationJavadoc;
private List packageDeclarationComments;
public UMLClass(String packageName, String name, LocationInfo locationInfo, boolean topLevel, List importedTypes) {
super(packageName, name, locationInfo, importedTypes);
if(packageName.equals(""))
this.qualifiedName = name;
else
this.qualifiedName = packageName + "." + name;
this.sourceFile = getSourceFile();
this.sourceFolder = "";
if(packageName.equals("")) {
int index = sourceFile.indexOf(name);
if(index != -1) {
this.sourceFolder = sourceFile.substring(0, index);
}
}
else {
if(topLevel) {
int index = sourceFile.indexOf(packageName.replace('.', '/'));
if(index != -1) {
this.sourceFolder = sourceFile.substring(0, index);
}
}
else {
int index = -1;
if(packageName.contains(".")) {
String realPackageName = packageName.substring(0, packageName.lastIndexOf('.'));
index = sourceFile.indexOf(realPackageName.replace('.', '/'));
}
else {
index = sourceFile.indexOf(packageName);
}
if(index != -1) {
this.sourceFolder = sourceFile.substring(0, index);
}
}
}
this.isAbstract = false;
this.isInterface = false;
this.topLevel = topLevel;
this.typeParameters = new ArrayList();
this.packageDeclarationComments = new ArrayList();
}
public String getTypeDeclarationKind() {
if(isInterface)
return "interface";
else if(isEnum)
return "enum";
else if(isAnnotation)
return "annotation";
else if(isRecord)
return "record";
else
return "class";
}
public List getTypeParameters() {
return typeParameters;
}
public List getTypeParameterNames() {
List typeParameterNames = new ArrayList();
for(UMLTypeParameter typeParameter : typeParameters) {
typeParameterNames.add(typeParameter.getName());
}
return typeParameterNames;
}
public void addTypeParameter(UMLTypeParameter typeParameter) {
typeParameters.add(typeParameter);
}
public String getName() {
return this.qualifiedName;
}
public boolean isTopLevel() {
return topLevel;
}
public void setTopLevel(boolean topLevel) {
this.topLevel = topLevel;
}
public Visibility getVisibility() {
return visibility;
}
public void setVisibility(Visibility visibility) {
this.visibility = visibility;
}
public boolean isFinal() {
return isFinal;
}
public void setFinal(boolean isFinal) {
this.isFinal = isFinal;
}
public boolean isStatic() {
return isStatic;
}
public void setStatic(boolean isStatic) {
this.isStatic = isStatic;
}
public boolean isEnum() {
return isEnum;
}
public void setEnum(boolean isEnum) {
this.isEnum = isEnum;
}
public boolean isAnnotation() {
return isAnnotation;
}
public void setAnnotation(boolean isAnnotation) {
this.isAnnotation = isAnnotation;
}
public boolean isRecord() {
return isRecord;
}
public void setRecord(boolean isRecord) {
this.isRecord = isRecord;
}
public boolean isInterface() {
return isInterface;
}
public void setInterface(boolean isInterface) {
this.isInterface = isInterface;
}
public boolean isAbstract() {
return isAbstract;
}
public void setAbstract(boolean isAbstract) {
this.isAbstract = isAbstract;
}
public UMLJavadoc getJavadoc() {
return javadoc;
}
public void setJavadoc(UMLJavadoc javadoc) {
this.javadoc = javadoc;
}
public UMLJavadoc getPackageDeclarationJavadoc() {
return packageDeclarationJavadoc;
}
public void setPackageDeclarationJavadoc(UMLJavadoc packageJavadoc) {
this.packageDeclarationJavadoc = packageJavadoc;
}
public List getPackageDeclarationComments() {
return packageDeclarationComments;
}
public UMLOperation matchOperation(UMLOperation otherOperation) {
ListIterator operationIt = operations.listIterator();
while(operationIt.hasNext()) {
UMLOperation operation = operationIt.next();
if(operation.getName().equals(otherOperation.getName())) {
if(operation.getParameters().size() == otherOperation.getParameters().size()) {
boolean match = true;
int i = 0;
for(UMLParameter parameter : operation.getParameters()) {
UMLParameter otherParameter = otherOperation.getParameters().get(i);
String thisParameterType = parameter.getType().getClassType();
String otherParameterType = otherParameter.getType().getClassType();
int thisArrayDimension = parameter.getType().getArrayDimension();
int otherArrayDimension = otherParameter.getType().getArrayDimension();
String thisParameterTypeComparedString = null;
if(thisParameterType.contains("."))
thisParameterTypeComparedString = thisParameterType.substring(thisParameterType.lastIndexOf(".")+1);
else
thisParameterTypeComparedString = thisParameterType;
String otherParameterTypeComparedString = null;
if(otherParameterType.contains("."))
otherParameterTypeComparedString = otherParameterType.substring(otherParameterType.lastIndexOf(".")+1);
else
otherParameterTypeComparedString = otherParameterType;
if(!thisParameterTypeComparedString.equals(otherParameterTypeComparedString) || thisArrayDimension != otherArrayDimension) {
match = false;
break;
}
i++;
}
if(match)
return operation;
}
}
}
return null;
}
public boolean hasSameNameAndKind(UMLClass umlClass) {
if(!this.name.equals(umlClass.name))
return false;
if(!hasSameKind(umlClass))
return false;
return true;
}
public boolean hasSameKind(UMLClass umlClass) {
if(this.isInterface != umlClass.isInterface)
return false;
if(!equalTypeParameters(umlClass))
return false;
return true;
}
private boolean equalTypeParameters(UMLClass umlClass) {
return this.typeParameters.equals(umlClass.typeParameters) || this.getTypeParameterNames().equals(umlClass.getTypeParameterNames()) ||
this.renamedParameterizedType(umlClass);
}
private boolean renamedParameterizedType(UMLClass umlClass) {
for(UMLOperation operation1 : this.operations) {
List parameterized1 = operation1.getParameterizedTypesInSignature();
if(!parameterized1.isEmpty()) {
for(UMLOperation operation2 : umlClass.operations) {
if(operation1.equalSignatureWithIdenticalNameIgnoringChangedTypes(operation2)) {
List parameterized2 = operation2.getParameterizedTypesInSignature();
if(parameterized1.size() == parameterized2.size()) {
int renamed = 0;
for(int i=0; i