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