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(0); 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 }