/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package signature.model.impl;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import signature.model.IAnnotationField;
import signature.model.IClassDefinition;
import signature.model.IConstructor;
import signature.model.IEnumConstant;
import signature.model.IField;
import signature.model.IMethod;
import signature.model.ITypeReference;
import signature.model.ITypeVariableDefinition;
import signature.model.Kind;
import signature.model.Modifier;
import signature.model.util.ModelUtil;
@SuppressWarnings("serial")
public class SigClassDefinition extends SigAnnotatableElement implements
IClassDefinition, Serializable {
private String name;
private Kind kind = Kind.UNINITIALIZED;
private ITypeReference superClass = Uninitialized.unset();
private Set<ITypeReference> interfaces = Uninitialized.unset();
private Set<Modifier> modifiers = Uninitialized.unset();
private Set<IMethod> methods = Uninitialized.unset();
private Set<IConstructor> constructors = Uninitialized.unset();
private Set<IClassDefinition> innerClasses = Uninitialized.unset();
private Set<IAnnotationField> annotationFields = Uninitialized.unset();
private Set<IField> fields = Uninitialized.unset();
private Set<IEnumConstant> enumConstants = Uninitialized.unset();
private IClassDefinition declaringClass = Uninitialized.unset();
private List<ITypeVariableDefinition> typeParameters = Uninitialized
.unset();
private String packageName;
public SigClassDefinition(String packageName, String name) {
this.packageName = packageName;
this.name = name;
}
public Kind getKind() {
return kind;
}
public void setKind(Kind kind) {
this.kind = kind;
}
public String getName() {
return name;
}
public String getPackageName() {
return packageName;
}
public List<String> getPackageFragments() {
return Arrays.asList(packageName.split("\\."));
}
public String getQualifiedName() {
return packageName + "." + name;
}
public Set<Modifier> getModifiers() {
return modifiers;
}
public void setModifiers(Set<Modifier> modifiers) {
this.modifiers = modifiers;
}
public Set<IClassDefinition> getInnerClasses() {
return innerClasses;
}
public void setInnerClasses(Set<IClassDefinition> innerClasses) {
this.innerClasses = innerClasses;
}
public Set<ITypeReference> getInterfaces() {
return interfaces;
}
public void setInterfaces(Set<ITypeReference> interfaces) {
this.interfaces = interfaces;
}
public Set<IMethod> getMethods() {
return methods;
}
public void setMethods(Set<IMethod> methods) {
this.methods = methods;
}
public Set<IConstructor> getConstructors() {
return constructors;
}
public void setConstructors(Set<IConstructor> constructors) {
this.constructors = constructors;
}
public ITypeReference getSuperClass() {
return superClass;
}
public void setSuperClass(ITypeReference superClass) {
this.superClass = superClass;
}
public IClassDefinition getDeclaringClass() {
return declaringClass;
}
public void setDeclaringClass(IClassDefinition declaringClass) {
this.declaringClass = declaringClass;
}
public Set<IAnnotationField> getAnnotationFields() {
return annotationFields;
}
public void setAnnotationFields(Set<IAnnotationField> annotationFields) {
this.annotationFields = annotationFields;
}
public Set<IField> getFields() {
return fields;
}
public void setFields(Set<IField> fields) {
this.fields = fields;
}
public Set<IEnumConstant> getEnumConstants() {
return enumConstants;
}
public void setEnumConstants(Set<IEnumConstant> enumConstants) {
this.enumConstants = enumConstants;
}
public List<ITypeVariableDefinition> getTypeParameters() {
return typeParameters;
}
public void setTypeParameters(
List<ITypeVariableDefinition> typeParameters) {
this.typeParameters = typeParameters;
}
@Override
public int hashCode() {
return SigClassDefinition.hashCode(this);
}
public static int hashCode(IClassDefinition definition) {
// FIXME find out why name and packageName are null during
// de-serialization some cases
// replace the following lines with:
// return definition.getQualifiedName().hashCode();
final int prime = 31;
int result = 1;
result = prime
+ ((definition.getName() == null) ? 0 : definition.getName()
.hashCode());
result = prime
* result
+ ((definition.getPackageName() == null) ? 0 : definition
.getPackageName().hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
return SigClassDefinition.equals(this, obj);
}
public static boolean equals(IClassDefinition thiz, Object obj) {
if (thiz == obj) return true;
if (obj instanceof IClassDefinition) {
IClassDefinition that = (IClassDefinition) obj;
return thiz.getName().equals(that.getName())
&& thiz.getPackageName().equals(that.getPackageName());
}
return false;
}
@Override
public String toString() {
return SigClassDefinition.toString(this);
}
public static String toString(IClassDefinition type) {
StringBuilder builder = new StringBuilder();
if (type.getAnnotations() != null && !type.getAnnotations().isEmpty()) {
// FIXME print annotations builder.append(super.toString());
builder.append("\n");
}
builder.append(type.getQualifiedName());
if (type.getTypeParameters() != null
&& (!type.getTypeParameters().isEmpty())) {
builder.append("<");
ModelUtil.separate(type.getTypeParameters(), ", ");
builder.append(">");
}
return builder.toString();
}
}