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 }