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 }