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