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    }