1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package signature.model.impl; 18 19 import java.io.Serializable; 20 import java.util.Arrays; 21 import java.util.List; 22 import java.util.Set; 23 24 import signature.model.IAnnotationField; 25 import signature.model.IClassDefinition; 26 import signature.model.IConstructor; 27 import signature.model.IEnumConstant; 28 import signature.model.IField; 29 import signature.model.IMethod; 30 import signature.model.ITypeReference; 31 import signature.model.ITypeVariableDefinition; 32 import signature.model.Kind; 33 import signature.model.Modifier; 34 import signature.model.util.ModelUtil; 35 36 @SuppressWarnings("serial") 37 public class SigClassDefinition extends SigAnnotatableElement implements 38 IClassDefinition, Serializable { 39 40 private String name; 41 private Kind kind = Kind.UNINITIALIZED; 42 private ITypeReference superClass = Uninitialized.unset(); 43 private Set<ITypeReference> interfaces = Uninitialized.unset(); 44 private Set<Modifier> modifiers = Uninitialized.unset(); 45 private Set<IMethod> methods = Uninitialized.unset(); 46 private Set<IConstructor> constructors = Uninitialized.unset(); 47 private Set<IClassDefinition> innerClasses = Uninitialized.unset(); 48 private Set<IAnnotationField> annotationFields = Uninitialized.unset(); 49 private Set<IField> fields = Uninitialized.unset(); 50 private Set<IEnumConstant> enumConstants = Uninitialized.unset(); 51 private IClassDefinition declaringClass = Uninitialized.unset(); 52 private List<ITypeVariableDefinition> typeParameters = Uninitialized 53 .unset(); 54 private String packageName; 55 56 public SigClassDefinition(String packageName, String name) { 57 this.packageName = packageName; 58 this.name = name; 59 } 60 61 public Kind getKind() { 62 return kind; 63 } 64 65 public void setKind(Kind kind) { 66 this.kind = kind; 67 } 68 69 public String getName() { 70 return name; 71 } 72 73 public String getPackageName() { 74 return packageName; 75 } 76 77 public List<String> getPackageFragments() { 78 return Arrays.asList(packageName.split("\\.")); 79 } 80 81 public String getQualifiedName() { 82 return packageName + "." + name; 83 } 84 85 public Set<Modifier> getModifiers() { 86 return modifiers; 87 } 88 89 public void setModifiers(Set<Modifier> modifiers) { 90 this.modifiers = modifiers; 91 } 92 93 public Set<IClassDefinition> getInnerClasses() { 94 return innerClasses; 95 } 96 97 public void setInnerClasses(Set<IClassDefinition> innerClasses) { 98 this.innerClasses = innerClasses; 99 } 100 101 public Set<ITypeReference> getInterfaces() { 102 return interfaces; 103 } 104 105 public void setInterfaces(Set<ITypeReference> interfaces) { 106 this.interfaces = interfaces; 107 } 108 109 public Set<IMethod> getMethods() { 110 return methods; 111 } 112 113 public void setMethods(Set<IMethod> methods) { 114 this.methods = methods; 115 } 116 117 public Set<IConstructor> getConstructors() { 118 return constructors; 119 } 120 121 public void setConstructors(Set<IConstructor> constructors) { 122 this.constructors = constructors; 123 } 124 125 public ITypeReference getSuperClass() { 126 return superClass; 127 } 128 129 public void setSuperClass(ITypeReference superClass) { 130 this.superClass = superClass; 131 } 132 133 public IClassDefinition getDeclaringClass() { 134 return declaringClass; 135 } 136 137 public void setDeclaringClass(IClassDefinition declaringClass) { 138 this.declaringClass = declaringClass; 139 } 140 141 public Set<IAnnotationField> getAnnotationFields() { 142 return annotationFields; 143 } 144 145 public void setAnnotationFields(Set<IAnnotationField> annotationFields) { 146 this.annotationFields = annotationFields; 147 } 148 149 public Set<IField> getFields() { 150 return fields; 151 } 152 153 public void setFields(Set<IField> fields) { 154 this.fields = fields; 155 } 156 157 public Set<IEnumConstant> getEnumConstants() { 158 return enumConstants; 159 } 160 161 public void setEnumConstants(Set<IEnumConstant> enumConstants) { 162 this.enumConstants = enumConstants; 163 } 164 165 public List<ITypeVariableDefinition> getTypeParameters() { 166 return typeParameters; 167 } 168 169 public void setTypeParameters( 170 List<ITypeVariableDefinition> typeParameters) { 171 this.typeParameters = typeParameters; 172 } 173 174 @Override 175 public int hashCode() { 176 return SigClassDefinition.hashCode(this); 177 } 178 179 public static int hashCode(IClassDefinition definition) { 180 // FIXME find out why name and packageName are null during 181 // de-serialization some cases 182 // replace the following lines with: 183 // return definition.getQualifiedName().hashCode(); 184 final int prime = 31; 185 int result = 1; 186 result = prime 187 + ((definition.getName() == null) ? 0 : definition.getName() 188 .hashCode()); 189 result = prime 190 * result 191 + ((definition.getPackageName() == null) ? 0 : definition 192 .getPackageName().hashCode()); 193 return result; 194 } 195 196 @Override 197 public boolean equals(Object obj) { 198 return SigClassDefinition.equals(this, obj); 199 } 200 201 public static boolean equals(IClassDefinition thiz, Object obj) { 202 if (thiz == obj) return true; 203 if (obj instanceof IClassDefinition) { 204 IClassDefinition that = (IClassDefinition) obj; 205 return thiz.getName().equals(that.getName()) 206 && thiz.getPackageName().equals(that.getPackageName()); 207 } 208 return false; 209 } 210 211 @Override 212 public String toString() { 213 return SigClassDefinition.toString(this); 214 } 215 216 public static String toString(IClassDefinition type) { 217 StringBuilder builder = new StringBuilder(); 218 if (type.getAnnotations() != null && !type.getAnnotations().isEmpty()) { 219 // FIXME print annotations builder.append(super.toString()); 220 builder.append("\n"); 221 } 222 builder.append(type.getQualifiedName()); 223 if (type.getTypeParameters() != null 224 && (!type.getTypeParameters().isEmpty())) { 225 builder.append("<"); 226 ModelUtil.separate(type.getTypeParameters(), ", "); 227 builder.append(">"); 228 } 229 return builder.toString(); 230 } 231 } 232