1920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/*
2920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Copyright (C) 2010 Google Inc.
3920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
4920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Licensed under the Apache License, Version 2.0 (the "License");
5920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * you may not use this file except in compliance with the License.
6920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * You may obtain a copy of the License at
7920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
8920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * http://www.apache.org/licenses/LICENSE-2.0
9920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
10920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Unless required by applicable law or agreed to in writing, software
11920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * distributed under the License is distributed on an "AS IS" BASIS,
12920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * See the License for the specific language governing permissions and
14920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * limitations under the License.
15920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */
16920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
17920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpackage com.google.doclava;
18920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
19d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.ArrayList;
20d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.Arrays;
21d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
22d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinpublic class AnnotationInstanceInfo implements Resolvable {
23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private ClassInfo mType;
246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  private String mAnnotationName; // for debugging purposes TODO - remove
25d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  private ArrayList<AnnotationValueInfo> mElementValues;
26d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  private ArrayList<Resolution> mResolutions;
27d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
28d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  public AnnotationInstanceInfo() {
29d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      mType = null;
30d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      mElementValues = new ArrayList<AnnotationValueInfo>();
31d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public AnnotationInstanceInfo(ClassInfo type, AnnotationValueInfo[] elementValues) {
34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mType = type;
35d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    mElementValues = new ArrayList<AnnotationValueInfo>(Arrays.asList(elementValues));
36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
37920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  ClassInfo type() {
39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mType;
40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
41920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
42d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  public void setClass(ClassInfo cl) {
43d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      mType = cl;
44d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
45d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  public void setSimpleAnnotationName(String name) {
476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      mAnnotationName = name;
48d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
49d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
50d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArrayList<AnnotationValueInfo> elementValues() {
51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mElementValues;
52920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
54d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  public void addElementValue(AnnotationValueInfo info) {
55d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      mElementValues.add(info);
56d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
57d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  @Override
59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public String toString() {
60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    StringBuilder str = new StringBuilder();
61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    str.append("@");
62d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (mType == null) {
636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        str.append(mAnnotationName);
64d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
65d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        str.append(mType.qualifiedName());
66d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
67920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    str.append("(");
68d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
69d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    for (AnnotationValueInfo value : mElementValues) {
70d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (value.element() != null) {
71d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          str.append(value.element().name());
72d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          str.append("=");
73d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      }
74d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      str.append(value.valueString());
76d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (value != mElementValues.get(mElementValues.size()-1)) {
77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        str.append(",");
78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
79920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
80920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    str.append(")");
81920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return str.toString();
82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
83d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
84d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  public void addResolution(Resolution resolution) {
85d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (mResolutions == null) {
86d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          mResolutions = new ArrayList<Resolution>();
87d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      }
88d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
89d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      mResolutions.add(resolution);
90d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
91d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
92d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  public void printResolutions() {
93d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      System.out.println("Resolutions for Annotation:");
94d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      for (Resolution r : mResolutions) {
95d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          System.out.println(r);
96d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      }
97d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
986ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
996ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  public boolean resolveResolutions() {
1006ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      ArrayList<Resolution> resolutions = mResolutions;
1016ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      mResolutions = new ArrayList<Resolution>();
1026ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1036ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      boolean allResolved = true;
1046ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      for (Resolution resolution : resolutions) {
1056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          StringBuilder qualifiedClassName = new StringBuilder();
1066ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          InfoBuilder.resolveQualifiedName(resolution.getValue(), qualifiedClassName,
1076ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                  resolution.getInfoBuilder());
1086ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          // if we still couldn't resolve it, save it for the next pass
1106ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          if ("".equals(qualifiedClassName.toString())) {
1116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein              mResolutions.add(resolution);
1126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein              allResolved = false;
1136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          } else if ("annotationTypeName".equals(resolution.getVariable())) {
1146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein              setClass(InfoBuilder.Caches.obtainClass(qualifiedClassName.toString()));
1156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          }
1166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      }
1176ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1186ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      return allResolved;
1196ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson}
121