001    /*
002     * file StpExceptionStpReasonCodeVisitor.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.util.SimpleDeclarationVisitor;
030    
031    public class StpExceptionStpReasonCodeVisitor extends SimpleDeclarationVisitor implements StpVisitor{
032        private final Map<Integer, TagInfo> m_enums = new HashMap<Integer, TagInfo>();
033        private final AnnotationProcessorEnvironment m_env;
034        
035        private static final String g_hxxFileName = "stp_reason_codes.hxx";
036        private static final String g_javaFileName = "STPReasonCodeMap.java";
037        
038        private PrintWriter m_hxxOut;
039        private PrintWriter m_javaOut;
040        
041        public StpExceptionStpReasonCodeVisitor(AnnotationProcessorEnvironment env)
042        {
043            //System.out.println("Creating StpExceptionStpReasonCodeVisitor");
044            m_env = env;
045        }
046    
047        public void begin() {
048            //System.out.println("StpExceptionStpReasonCodeVisitor begin");
049            Filer filer = m_env.getFiler();
050            writeHxxBegin(filer);
051            writeJavaBegin(filer);
052        }
053    
054        public void end() {
055            TreeSet<Integer> keys = new TreeSet<Integer>(m_enums.keySet());
056            writeHxxEnd(keys);
057            writeJavaEnd(keys);
058            //System.out.println("StpExceptionStpReasonCodeVisitor end");
059        }
060        
061        public void writeHxxBegin(Filer filer)
062        {
063            m_hxxOut = createFile(filer, g_hxxFileName);
064            writeCommonHeader(m_hxxOut, this);
065        }
066        
067        public void writeHxxEnd(TreeSet<Integer> keys)
068        {
069            boolean first = true;
070            for (Integer id : keys) {
071                TagInfo info = m_enums.get(id);
072                if (!first) {
073                    m_hxxOut.println(",");
074                }
075                m_hxxOut.print(INDENT + info.fieldName + " = " + id);
076                if (first) first = false;
077            }
078            m_hxxOut.println("");
079            
080            m_hxxOut.flush();
081            m_hxxOut.close();        
082        }
083    
084        private void writeJavaBegin(Filer filer)
085        {
086            m_javaOut = createFile(filer, g_javaFileName);
087    
088            writeCommonHeader(m_javaOut, this);
089    
090            m_javaOut.println("package com.ibm.rational.stp.server.rpc;");
091            m_javaOut.println("");
092            m_javaOut.println("import java.util.Map;");
093            m_javaOut.println("import java.util.HashMap;");
094            m_javaOut.println("import com.ibm.rational.wvcm.stp.StpException;");
095            m_javaOut.println("");
096            m_javaOut.println("/**");
097            m_javaOut.println(" * Mapping services from/to StpException.StpReasonCodes to/from");
098            m_javaOut.println(" * RPC enumerated reason code names.");
099            m_javaOut.println(" */");
100            m_javaOut.println("public class STPReasonCodeMap");
101            m_javaOut.println("{");
102            m_javaOut.println("    /**");
103            m_javaOut.println("     * Get the StpReasonCode associated with RPC error code.");
104            m_javaOut.println("     *");
105            m_javaOut.println("     * @param code IN: RPC integer value error code");
106            m_javaOut.println("     *");
107            m_javaOut.println("     * @return StpReasonCode associated with RPC error code");
108            m_javaOut.println("     */");
109            m_javaOut.println("    public static StpException.StpReasonCode");
110            m_javaOut.println("    getSTPReasonCode(int code) { return g_reasonCodes.get(code); }");
111            m_javaOut.println("");
112            m_javaOut.println("    private static final Map<Integer, StpException.StpReasonCode> g_reasonCodes = new HashMap<Integer, StpException.StpReasonCode>();");
113            m_javaOut.println("");
114            m_javaOut.println("    static {");
115            m_javaOut.println("        ");
116        }
117    
118        private void writeJavaEnd(TreeSet<Integer> keys)
119        {
120            for (Integer id : keys) {
121                TagInfo info = m_enums.get(id);
122                m_javaOut.println("        g_reasonCodes.put(" + info.id + ", StpException.StpReasonCode." + info.fieldName + ");"); 
123            }
124    
125            m_javaOut.println("    }");
126            m_javaOut.println("}");
127    
128            m_javaOut.flush();
129            m_javaOut.close();
130        }
131        
132        @Override
133        public void visitEnumConstantDeclaration(EnumConstantDeclaration ecd) {
134    
135            TagInfo info = getRpcEnumValues(ecd.getAnnotationMirrors());
136            if (info != null) {
137                info.fieldName = ecd.getSimpleName();
138                ensureUniqueAndAddIfSo(m_enums, info);
139            }
140        }
141    }