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(1);
226 }
227
228 ensureUniqueAndAddIfSo(m_xmltags, info);
229 }
230 }
231 }