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 }