/* * Copyright (C) 2010 Google Inc. * * 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 com.google.doclava; import com.google.clearsilver.jsilver.data.Data; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; public class AnnotationInstanceInfo implements Resolvable { private ClassInfo mType; private String mAnnotationName; // for debugging purposes TODO - remove private ArrayList mElementValues; private ArrayList mResolutions; public AnnotationInstanceInfo() { mType = null; mElementValues = new ArrayList(); } public AnnotationInstanceInfo(ClassInfo type, AnnotationValueInfo[] elementValues) { mType = type; mElementValues = new ArrayList(Arrays.asList(elementValues)); } ClassInfo type() { return mType; } public void setClass(ClassInfo cl) { mType = cl; } public void setSimpleAnnotationName(String name) { mAnnotationName = name; } ArrayList elementValues() { return mElementValues; } public void addElementValue(AnnotationValueInfo info) { mElementValues.add(info); } @Override public String toString() { StringBuilder str = new StringBuilder(); str.append("@"); if (mType == null) { str.append(mAnnotationName); } else { str.append(mType.qualifiedName()); } str.append("("); for (AnnotationValueInfo value : mElementValues) { if (value.element() != null) { str.append(value.element().name()); str.append("="); } str.append(value.valueString()); if (value != mElementValues.get(mElementValues.size()-1)) { str.append(","); } } str.append(")"); return str.toString(); } public void addResolution(Resolution resolution) { if (mResolutions == null) { mResolutions = new ArrayList(); } mResolutions.add(resolution); } public void printResolutions() { System.out.println("Resolutions for Annotation:"); for (Resolution r : mResolutions) { System.out.println(r); } } public boolean resolveResolutions() { ArrayList resolutions = mResolutions; mResolutions = new ArrayList(); boolean allResolved = true; for (Resolution resolution : resolutions) { StringBuilder qualifiedClassName = new StringBuilder(); InfoBuilder.resolveQualifiedName(resolution.getValue(), qualifiedClassName, resolution.getInfoBuilder()); // if we still couldn't resolve it, save it for the next pass if ("".equals(qualifiedClassName.toString())) { mResolutions.add(resolution); allResolved = false; } else if ("annotationTypeName".equals(resolution.getVariable())) { setClass(InfoBuilder.Caches.obtainClass(qualifiedClassName.toString())); } } return allResolved; } /** * Convert the specified list of {@code AnnotationInstanceInfo} into an HDF-formatted list, and * add the HDF list into the specified {@code Data}. */ public static void makeLinkListHDF(Data data, String base, AnnotationInstanceInfo[] annotations) { if (annotations == null) return; final int N = annotations.length; for (int i = 0; i < N; i++) { AnnotationInstanceInfo aii = annotations[i]; final String aiiBase = base + "." + i; // Serialize data about the annotation element values for (int elemIdx = 0; elemIdx < aii.elementValues().size(); ++elemIdx) { final String elemBase = aiiBase + ".elementValues." + elemIdx; final AnnotationValueInfo value = aii.elementValues().get(elemIdx); data.setValue(elemBase + ".name", value.element().name()); data.setValue(elemBase + ".value", value.valueString()); } aii.type().makeShortDescrHDF(data, aiiBase); } } /** * Get a new list containing the set of annotations that are shared between * the input annotations collection and the set of allowed annotations. */ public static ArrayList getAnnotationsIntersection( Collection allowedAnnotations, Collection allAnnotations) { ArrayList list = new ArrayList(); java.util.Objects.requireNonNull(allowedAnnotations); if (allAnnotations != null) { for (AnnotationInstanceInfo info : allAnnotations) { if (allowedAnnotations.contains(info.type().qualifiedName())) { list.add(info); } } } return list; } /** * Get a new list containing the set of annotations that are shared between * the input annotations collection and the names of annotations passed in * the showAnnotations parameter */ public static ArrayList getShowAnnotationsIntersection( Collection annotations) { return getAnnotationsIntersection(Doclava.showAnnotations, annotations); } /** * Get a new list containing the set of annotations that are shared between * the input annotations collection and the names of annotations passed in * the hideAnnotations parameter */ public static ArrayList getHideAnnotationsIntersection( Collection annotations) { return getAnnotationsIntersection(Doclava.hideAnnotations, annotations); } }