001 /* 002 * file XmlTagVisitor.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.ibm.rational.wvcm.stpex.annotation.processing.ListClassesVisitor.INDENT; 016 import static com.ibm.rational.wvcm.stpex.annotation.processing.ListClassesVisitor.createFile; 017 import static com.ibm.rational.wvcm.stpex.annotation.processing.ListClassesVisitor.ensureUniqueAndAddIfSo; 018 import static com.ibm.rational.wvcm.stpex.annotation.processing.ListClassesVisitor.getRpcEnumValues; 019 import static com.ibm.rational.wvcm.stpex.annotation.processing.ListClassesVisitor.writeCommonHeader; 020 021 import java.io.PrintWriter; 022 import java.util.HashMap; 023 import java.util.Map; 024 import java.util.TreeSet; 025 026 import com.sun.mirror.apt.AnnotationProcessorEnvironment; 027 import com.sun.mirror.apt.Filer; 028 import com.sun.mirror.declaration.FieldDeclaration; 029 import com.sun.mirror.util.SimpleDeclarationVisitor; 030 031 public class XmlTagVisitor extends SimpleDeclarationVisitor implements StpVisitor 032 { 033 private final AnnotationProcessorEnvironment m_env; 034 035 private static final String g_hxxFileName = "xmltag_tag_decl.hxx"; 036 private static final String g_cxxFileName = "xmltag_tag_impl.cxx"; 037 private static final String g_xFileName = "stprpc_xml_tag_id.x"; 038 private static final String g_javaFileName = "XmlTagId.java"; 039 040 private PrintWriter m_hxxOut; 041 private PrintWriter m_cxxOut; 042 private PrintWriter m_xOut; 043 044 private PrintWriter m_javaOut; 045 046 private final Map<Integer, TagInfo> m_xmltags = new HashMap<Integer, TagInfo>(); 047 048 public XmlTagVisitor(AnnotationProcessorEnvironment env) 049 { 050 //System.out.println("Creating XmlTagVistor"); 051 m_env = env; 052 } 053 054 public void begin() 055 { 056 //System.out.println("XmlTagVistor begin"); 057 Filer filer = m_env.getFiler(); 058 059 writeHxxBegin(filer); 060 writeCxxBegin(filer); 061 writeXBegin(filer); 062 063 writeJavaBegin(filer); 064 } 065 066 public void end() 067 { 068 TreeSet<Integer> keys = new TreeSet<Integer>(m_xmltags.keySet()); 069 070 writeHxxEnd(keys); 071 writeCxxEnd(keys); 072 writeXEnd(keys); 073 074 writeJavaEnd(keys); 075 076 //System.out.println("XmlTagVistor end"); 077 } 078 079 public void writeXBegin(Filer filer) 080 { 081 m_xOut = createFile(filer, g_xFileName); 082 writeCommonHeader(m_xOut, this); 083 } 084 085 public void writeXEnd(TreeSet<Integer> keys) 086 { 087 for (Integer id : keys) { 088 TagInfo info = m_xmltags.get(id); 089 m_xOut.println(INDENT + info.fieldName + " = " + id + ","); 090 } 091 092 m_xOut.println(INDENT + "FIRST_DYNAMIC_PROP = 1000000"); 093 094 m_xOut.flush(); 095 m_xOut.close(); 096 } 097 098 public void writeHxxBegin(Filer filer) 099 { 100 m_hxxOut = createFile(filer, g_hxxFileName); 101 writeCommonHeader(m_hxxOut, this); 102 m_hxxOut.println(""); 103 m_hxxOut.println("enum Id {"); 104 } 105 106 public void writeHxxEnd(TreeSet<Integer> keys) 107 { 108 for (Integer id : keys) { 109 TagInfo info = m_xmltags.get(id); 110 m_hxxOut.println(INDENT + info.fieldName + " = " + id + ","); 111 } 112 113 m_hxxOut.println(INDENT + "NUM_PREDEFINED_TAGS"); 114 m_hxxOut.println("};"); 115 116 m_hxxOut.flush(); 117 m_hxxOut.close(); 118 } 119 120 public void writeCxxBegin(Filer filer) 121 { 122 m_cxxOut = createFile(filer, g_cxxFileName); 123 124 writeCommonHeader(m_cxxOut, this); 125 } 126 127 public void writeCxxEnd(TreeSet<Integer> keys) 128 { 129 for (Integer id : keys) { 130 TagInfo info = m_xmltags.get(id); 131 m_cxxOut.println("TAG_DEFN(L\"" + info.ns + "\", L\"" + info.simple + "\", " + info.fieldName + ");"); 132 } 133 134 m_cxxOut.flush(); 135 m_cxxOut.close(); 136 } 137 138 public void writeJavaBegin(Filer filer) 139 { 140 m_javaOut = createFile(filer, g_javaFileName); 141 142 writeCommonHeader(m_javaOut, this); 143 144 m_javaOut.println("package com.ibm.rational.stp.server.rpc;"); 145 m_javaOut.println(""); 146 m_javaOut.println("import java.util.Map;"); 147 m_javaOut.println("import java.util.Map.Entry;"); 148 m_javaOut.println("import java.util.HashMap;"); 149 m_javaOut.println("import com.ibm.rational.stp.cs.internal.util.XmlTag;"); 150 m_javaOut.println("/**"); 151 m_javaOut.println(" * Mapping services XmlTag objects and RPC XML tag ID codes."); 152 m_javaOut.println(" */"); 153 m_javaOut.println("public class XmlTagId"); 154 m_javaOut.println("{"); 155 m_javaOut.println(" public static final int FIRST_DYNAMIC_PROP = 1000000;"); 156 m_javaOut.println(" /**"); 157 m_javaOut.println(" * Get the XML tag associated with integer tag ID."); 158 m_javaOut.println(" *"); 159 m_javaOut.println(" * @param name IN: RPC integer value tag ID"); 160 m_javaOut.println(" *"); 161 m_javaOut.println(" * @return XmlTag associated with RPC tag ID"); 162 m_javaOut.println(" */"); 163 m_javaOut.println(" public static XmlTag"); 164 m_javaOut.println(" getTag(int id) "); 165 m_javaOut.println(" {"); 166 m_javaOut.println(" XmlTag tag = g_idToTagMap.get(id);"); 167 m_javaOut.println(""); 168 m_javaOut.println(" return tag == null ? XmlTag.NIL : tag;"); 169 m_javaOut.println(" }"); 170 m_javaOut.println(""); 171 m_javaOut.println(" /**"); 172 m_javaOut.println(" * Get RPC integer value tag ID associated with XML tag."); 173 m_javaOut.println(" *"); 174 m_javaOut.println(" * @param name IN: XmlTag"); 175 m_javaOut.println(" *"); 176 m_javaOut.println(" * @return RPC integer value tag ID"); 177 m_javaOut.println(" */"); 178 m_javaOut.println(" public static int"); 179 m_javaOut.println(" getId(XmlTag tag)"); 180 m_javaOut.println(" {"); 181 m_javaOut.println(" Integer id = g_tagToIdMap.get(tag);"); 182 m_javaOut.println(""); 183 m_javaOut.println(" return id == null ? 0 : id.intValue();"); 184 m_javaOut.println(" }"); 185 m_javaOut.println(""); 186 m_javaOut.println(" private static final Map<Integer, XmlTag> g_idToTagMap = new HashMap<Integer, XmlTag>();"); 187 m_javaOut.println(" private static final Map<XmlTag, Integer> g_tagToIdMap = new HashMap<XmlTag, Integer>();"); 188 m_javaOut.println(""); 189 m_javaOut.println(" static {"); 190 } 191 192 public void writeJavaEnd(TreeSet<Integer> keys) 193 { 194 for (Integer id : keys) { 195 TagInfo info = m_xmltags.get(id); 196 m_javaOut.println(" g_idToTagMap.put(" + info.id + ", XmlTag." + info.fieldName + ");"); 197 } 198 199 m_javaOut.println(""); 200 m_javaOut.println(""); 201 m_javaOut.println(" for (Entry<Integer, XmlTag> entry: g_idToTagMap.entrySet()) {"); 202 m_javaOut.println(" g_tagToIdMap.put(entry.getValue(), entry.getKey());"); 203 m_javaOut.println(" }"); 204 m_javaOut.println(" }"); 205 m_javaOut.println("}"); 206 207 m_javaOut.flush(); 208 m_javaOut.close(); 209 } 210 211 @Override 212 public void visitFieldDeclaration(FieldDeclaration f) 213 { 214 TagInfo info = getRpcEnumValues(f.getAnnotationMirrors()); 215 216 if (info != null) { 217 218 info.fieldName = f.getSimpleName(); 219 220 if (info.id == null || info.ns == null || info.simple == null) { 221 222 System.err.print("Error: missing value for field '"+ info.fieldName + "' no values should be null: "); 223 System.err.println("id = " + info.id + ", ns = " + info.ns + ", simple = " + info.simple); 224 System.err.println("Error: exiting unexpectedly"); 225 System.exit(0); 226 } 227 228 ensureUniqueAndAddIfSo(m_xmltags, info); 229 } 230 } 231 }