001    /*
002     * file XmlNsVisitor.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.EnumConstantDeclaration;
029    import com.sun.mirror.declaration.FieldDeclaration;
030    import com.sun.mirror.util.SimpleDeclarationVisitor;
031    
032    public class XmlNsVisitor extends SimpleDeclarationVisitor implements StpVisitor{
033        private final Map<Integer, TagInfo> m_enums = new HashMap<Integer, TagInfo>();
034        private final AnnotationProcessorEnvironment m_env;
035        
036        private static final String g_hxxFileName = "xmltag_ns_decl.hxx";
037        private static final String g_cxxFileName = "xmltag_ns_impl.cxx";
038        
039        private PrintWriter m_hxxOut;
040        private PrintWriter m_cxxOut;
041        
042        public XmlNsVisitor(AnnotationProcessorEnvironment env)
043        {
044            //System.out.println("Creating XmlNsVisitor");
045            m_env = env;
046        }
047        
048        public void begin() {
049            //System.out.println("XmlNsVisitor begin");
050            Filer filer = m_env.getFiler();
051            writeHxxBegin(filer);
052            writeCxxBegin(filer);
053        }
054    
055        public void end() {
056            
057            TreeSet<Integer> keys = new TreeSet<Integer>(m_enums.keySet());
058            writeHxxEnd(keys);
059            writeCxxEnd(keys);
060            //System.out.println("XmlNsVisitor end");
061        }
062        
063        public void writeHxxBegin(Filer filer)
064        {
065            m_hxxOut = createFile(filer, g_hxxFileName);
066            writeCommonHeader(m_hxxOut, this);
067        }
068        
069        public void writeHxxEnd(TreeSet<Integer> keys)
070        {
071            for (Integer id : keys) {
072                TagInfo info = m_enums.get(id);
073                m_hxxOut.println(INDENT + info.fieldName + " = " + id + ",");
074            }
075            
076            m_hxxOut.flush();
077            m_hxxOut.close();        
078        }
079        
080        public void writeCxxBegin(Filer filer) 
081        {
082            m_cxxOut = createFile(filer, g_cxxFileName);
083            writeCommonHeader(m_cxxOut, this);
084        }
085        
086        public void writeCxxEnd(TreeSet<Integer> keys)
087        {
088            for (Integer id : keys) {
089                TagInfo info = m_enums.get(id);
090                m_cxxOut.println("NS_DEFN(" + info.fieldName + ", L\"" + info.simple + "\", L\"" + info.ns + "\"),");  
091            }
092            
093            m_cxxOut.flush();
094            m_cxxOut.close();        
095        }
096        
097        @Override
098        public void visitFieldDeclaration(FieldDeclaration f)
099        {
100            TagInfo info = getRpcEnumValues(f.getAnnotationMirrors());
101            if (info != null) {
102                info.fieldName = f.getSimpleName();
103                
104                if (info.id == null || info.ns == null || info.simple == null) {
105                    
106                    System.err.print("Error: missing value for field '"+ info.fieldName + "' no values should be null: ");
107                    System.err.println("id = " + info.id + ", ns = " + info.ns + ", simple = " + info.simple);
108                    System.err.println("Error: exiting unexpectedly");
109                    System.exit(0);
110                }
111                
112                ensureUniqueAndAddIfSo(m_enums, info);
113            }
114        }
115    }