001 /*
002 * file ListClassesVisitor.java
003 *
004 * IBM Confidential
005 * OCO Source Materials
006 * Rational ClearCase
007 * (C) Copyright IBM Corp. 2010. All rights reserved.
008 *
009 * The source code for this program is not published or otherwise
010 * divested of its trade secrets, irrespective of what has been
011 * deposited with the U.S. Copyright Office.
012 */
013 package com.ibm.rational.wvcm.stpex.annotation.processing;
014
015 import static com.sun.mirror.util.DeclarationVisitors.NO_OP;
016 import static com.sun.mirror.util.DeclarationVisitors.getSourceOrderDeclarationScanner;
017
018 import java.io.File;
019 import java.io.IOException;
020 import java.io.PrintWriter;
021 import java.util.Collection;
022 import java.util.Map;
023 import java.util.Map.Entry;
024
025
026 import com.ibm.rational.wvcm.stpex.annotation.RpcEnum;
027 import com.ibm.rational.wvcm.stpex.annotation.processing.StpVisitor.TagInfo;
028 import com.sun.mirror.apt.AnnotationProcessorEnvironment;
029 import com.sun.mirror.apt.Filer;
030 import com.sun.mirror.declaration.AnnotationMirror;
031 import com.sun.mirror.declaration.AnnotationTypeElementDeclaration;
032 import com.sun.mirror.declaration.AnnotationValue;
033 import com.sun.mirror.declaration.ClassDeclaration;
034 import com.sun.mirror.type.AnnotationType;
035 import com.sun.mirror.util.SimpleDeclarationVisitor;
036
037 public class ListClassesVisitor extends SimpleDeclarationVisitor
038 {
039 static final String INDENT = " ";
040 static final String ID_NAME = "id";
041 static final String NS_NAME = "ns";
042 static final String SIMPLE_NAME = "simpleName";
043
044 private final AnnotationProcessorEnvironment m_env;
045
046 public ListClassesVisitor(AnnotationProcessorEnvironment env)
047 {
048 //System.out.println("Creating ListClassesVisitor");
049 m_env = env;
050 }
051
052 @Override
053 public void visitClassDeclaration(ClassDeclaration c)
054 {
055 //System.out.println("Visiting Class: " + c.getQualifiedName());
056
057 StpVisitor visitor = null;
058
059 if (c.getQualifiedName().equals("com.ibm.rational.stp.cs.internal.util.XmlTag")) {
060
061 visitor = new XmlTagVisitor(m_env);
062 }
063 else if (c.getQualifiedName().equals("com.ibm.rational.stp.cs.internal.util.XmlNs")) {
064
065 visitor = new XmlNsVisitor(m_env);
066 }
067 else if (c.getQualifiedName().equals("com.ibm.rational.wvcm.stp.StpProvider.Domain")) {
068
069 visitor = new ProviderDomainVisitor(m_env);
070 }
071 else if (c.getQualifiedName().equals("com.ibm.rational.wvcm.stp.StpLocation.Namespace")) {
072
073 visitor = new StpLocationNamespaceVisitor(m_env);
074 }
075 else if (c.getQualifiedName().equals("com.ibm.rational.wvcm.stp.StpException.StpReasonCode")) {
076
077 visitor = new StpExceptionStpReasonCodeVisitor(m_env);
078 }
079
080 if (visitor != null) {
081 visitor.begin();
082 c.accept(getSourceOrderDeclarationScanner(NO_OP, (SimpleDeclarationVisitor)visitor));
083 visitor.end();
084 }
085 }
086
087 static TagInfo getRpcEnumValues(Collection<AnnotationMirror> amirrors)
088 {
089 for (AnnotationMirror am : amirrors) {
090
091 try {
092 String name = am.getAnnotationType().getDeclaration().getQualifiedName();
093
094 if (name.equals(RpcEnum.class.getName())) {
095 return getRpcValues(am);
096 }
097 }
098 catch (ClassCastException e) {
099
100 System.err.println("Error: encoutnered unknown annotation" + am.getPosition().toString());
101 }
102 }
103
104 return null;
105 }
106
107 static TagInfo getRpcValues(AnnotationMirror am)
108 {
109 TagInfo info = new TagInfo();
110
111 Map<AnnotationTypeElementDeclaration, AnnotationValue> values = am.getElementValues();
112
113 info.position = am.getPosition().toString();
114
115 for (Entry<AnnotationTypeElementDeclaration, AnnotationValue> entry : values.entrySet()) {
116
117 if (entry.getKey().getSimpleName().equals(ID_NAME)) {
118 info.id = entry.getValue().toString();
119 }
120 else if (entry.getKey().getSimpleName().equals(NS_NAME)) {
121 info.ns = (String)entry.getValue().getValue();
122 }
123 else if (entry.getKey().getSimpleName().equals(SIMPLE_NAME)) {
124 info.simple = (String)entry.getValue().getValue();
125 }
126 }
127
128 return info;
129 }
130
131 static void ensureUniqueAndAddIfSo(Map<Integer, TagInfo> map, TagInfo info)
132 {
133 int intValue = Integer.parseInt(info.id);
134
135 if (map.containsKey(intValue)) {
136
137 System.err.println("Error: For enum '" + info.fieldName +
138 "' RpcEnumId value '" + intValue +
139 "' is already defined for enum '" +
140 map.get(intValue).fieldName);
141 System.err.println("Existing pos: " + info.position);
142 System.err.println("Current pos: " + info.position);
143 System.err.println("Error: exiting unexpectedly");
144 System.exit(1);
145 }
146 else {
147 map.put(intValue, info);
148 }
149 }
150
151 static PrintWriter createFile(Filer filer, String fileName)
152 {
153 System.out.println("Creating file: " + fileName);
154 try {
155 return filer.createTextFile(Filer.Location.SOURCE_TREE,
156 /*package*/"",
157 new File(fileName),
158 /*charset*/null);
159 }
160 catch (IOException e) {
161 e.printStackTrace();
162 System.err.println("Error: exiting unexpectedly");
163 System.exit(1);
164 }
165
166 return null;
167 }
168
169 static void writeCommonHeader(PrintWriter pw, Object o)
170 {
171 pw.println("/**");
172 pw.println(" * Do not modify this file. This is a generated file");
173 pw.println(" * Generated By: " + o.getClass().getName());
174 pw.println(" */");
175 }
176 }