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.compare.model.subst;
18 
19 import java.util.Collections;
20 import java.util.HashSet;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.Set;
24 
25 import signature.model.IAnnotation;
26 import signature.model.IAnnotationField;
27 import signature.model.IClassDefinition;
28 import signature.model.IConstructor;
29 import signature.model.IEnumConstant;
30 import signature.model.IField;
31 import signature.model.IMethod;
32 import signature.model.ITypeReference;
33 import signature.model.ITypeVariableDefinition;
34 import signature.model.Kind;
35 import signature.model.Modifier;
36 import signature.model.impl.SigClassDefinition;
37 
38 public class ClassProjection implements IClassDefinition {
39 
40     private final IClassDefinition original;
41     private final Map<ITypeVariableDefinition, ITypeReference> substitutions;
42 
ClassProjection(IClassDefinition original, Map<ITypeVariableDefinition, ITypeReference> mapping)43     public ClassProjection(IClassDefinition original,
44             Map<ITypeVariableDefinition, ITypeReference> mapping) {
45         this.original = original;
46         this.substitutions = mapping;
47     }
48 
getAnnotationFields()49     public Set<IAnnotationField> getAnnotationFields() {
50         throw new UnsupportedOperationException();
51     }
52 
getAnnotations()53     public Set<IAnnotation> getAnnotations() {
54         throw new UnsupportedOperationException();
55     }
56 
getConstructors()57     public Set<IConstructor> getConstructors() {
58         throw new UnsupportedOperationException();
59     }
60 
getDeclaringClass()61     public IClassDefinition getDeclaringClass() {
62         throw new UnsupportedOperationException();
63     }
64 
getEnumConstants()65     public Set<IEnumConstant> getEnumConstants() {
66         throw new UnsupportedOperationException();
67     }
68 
getFields()69     public Set<IField> getFields() {
70         throw new UnsupportedOperationException();
71     }
72 
getInnerClasses()73     public Set<IClassDefinition> getInnerClasses() {
74         throw new UnsupportedOperationException();
75     }
76 
77     Set<ITypeReference> interfaces = null;
78 
getInterfaces()79     public Set<ITypeReference> getInterfaces() {
80         if (interfaces == null) {
81             Set<ITypeReference> originalInterfaces = original.getInterfaces();
82             if (originalInterfaces == null) {
83                 interfaces = Collections.emptySet();
84             } else {
85                 interfaces = new HashSet<ITypeReference>();
86                 for (ITypeReference interfaze : originalInterfaces) {
87                     interfaces.add(ViewpointAdapter.substitutedTypeReference(
88                             interfaze, substitutions));
89                 }
90                 interfaces = Collections.unmodifiableSet(interfaces);
91             }
92         }
93         return interfaces;
94     }
95 
getKind()96     public Kind getKind() {
97         return original.getKind();
98     }
99 
100 
101     Set<IMethod> methods = null;
102 
getMethods()103     public Set<IMethod> getMethods() {
104         if (methods == null) {
105             Set<IMethod> originalMethods = original.getMethods();
106             if (originalMethods == null) {
107                 methods = Collections.emptySet();
108             } else {
109                 methods = new HashSet<IMethod>();
110                 for (IMethod m : original.getMethods()) {
111                     methods.add(new MethodProjection(m, substitutions));
112                 }
113                 methods = Collections.unmodifiableSet(methods);
114             }
115         }
116         return methods;
117     }
118 
getModifiers()119     public Set<Modifier> getModifiers() {
120         return original.getModifiers();
121     }
122 
getName()123     public String getName() {
124         return original.getName();
125     }
126 
getPackageFragments()127     public List<String> getPackageFragments() {
128         return original.getPackageFragments();
129     }
130 
getPackageName()131     public String getPackageName() {
132         return original.getPackageName();
133     }
134 
getQualifiedName()135     public String getQualifiedName() {
136         return original.getQualifiedName();
137     }
138 
139     private boolean superClassInit = false;
140     private ITypeReference superClass = null;
141 
getSuperClass()142     public ITypeReference getSuperClass() {
143         if (!superClassInit) {
144             ITypeReference originalSuperClass = original.getSuperClass();
145             if (originalSuperClass != null) {
146                 superClass = ViewpointAdapter.substitutedTypeReference(original
147                         .getSuperClass(), substitutions);
148             }
149             superClassInit = true;
150         }
151         return superClass;
152     }
153 
154     // Definitions of type variables are not substituted
getTypeParameters()155     public List<ITypeVariableDefinition> getTypeParameters() {
156         return original.getTypeParameters();
157     }
158 
159     @Override
hashCode()160     public int hashCode() {
161         return SigClassDefinition.hashCode(this);
162     }
163 
164     @Override
equals(Object obj)165     public boolean equals(Object obj) {
166         return SigClassDefinition.equals(this, obj);
167     }
168 
169     @Override
toString()170     public String toString() {
171         return "(" + SigClassDefinition.toString(this) + " : " + substitutions
172                 + " )";
173     }
174 
175 }
176