001 /*
002 * file XmlNsVisitor.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.declaration.FieldDeclaration;
030 import com.sun.mirror.util.SimpleDeclarationVisitor;
031
032 public class XmlNsVisitor extends SimpleDeclarationVisitor implements StpVisitor{
033 private final Map<Integer, TagInfo> m_enums = new HashMap<Integer, TagInfo>();
034 private final AnnotationProcessorEnvironment m_env;
035
036 private static final String g_hxxFileName = "xmltag_ns_decl.hxx";
037 private static final String g_cxxFileName = "xmltag_ns_impl.cxx";
038
039 private PrintWriter m_hxxOut;
040 private PrintWriter m_cxxOut;
041
042 public XmlNsVisitor(AnnotationProcessorEnvironment env)
043 {
044 //System.out.println("Creating XmlNsVisitor");
045 m_env = env;
046 }
047
048 public void begin() {
049 //System.out.println("XmlNsVisitor begin");
050 Filer filer = m_env.getFiler();
051 writeHxxBegin(filer);
052 writeCxxBegin(filer);
053 }
054
055 public void end() {
056
057 TreeSet<Integer> keys = new TreeSet<Integer>(m_enums.keySet());
058 writeHxxEnd(keys);
059 writeCxxEnd(keys);
060 //System.out.println("XmlNsVisitor end");
061 }
062
063 public void writeHxxBegin(Filer filer)
064 {
065 m_hxxOut = createFile(filer, g_hxxFileName);
066 writeCommonHeader(m_hxxOut, this);
067 }
068
069 public void writeHxxEnd(TreeSet<Integer> keys)
070 {
071 for (Integer id : keys) {
072 TagInfo info = m_enums.get(id);
073 m_hxxOut.println(INDENT + info.fieldName + " = " + id + ",");
074 }
075
076 m_hxxOut.flush();
077 m_hxxOut.close();
078 }
079
080 public void writeCxxBegin(Filer filer)
081 {
082 m_cxxOut = createFile(filer, g_cxxFileName);
083 writeCommonHeader(m_cxxOut, this);
084 }
085
086 public void writeCxxEnd(TreeSet<Integer> keys)
087 {
088 for (Integer id : keys) {
089 TagInfo info = m_enums.get(id);
090 m_cxxOut.println("NS_DEFN(" + info.fieldName + ", L\"" + info.simple + "\", L\"" + info.ns + "\"),");
091 }
092
093 m_cxxOut.flush();
094 m_cxxOut.close();
095 }
096
097 @Override
098 public void visitFieldDeclaration(FieldDeclaration f)
099 {
100 TagInfo info = getRpcEnumValues(f.getAnnotationMirrors());
101 if (info != null) {
102 info.fieldName = f.getSimpleName();
103
104 if (info.id == null || info.ns == null || info.simple == null) {
105
106 System.err.print("Error: missing value for field '"+ info.fieldName + "' no values should be null: ");
107 System.err.println("id = " + info.id + ", ns = " + info.ns + ", simple = " + info.simple);
108 System.err.println("Error: exiting unexpectedly");
109 System.exit(1);
110 }
111
112 ensureUniqueAndAddIfSo(m_enums, info);
113 }
114 }
115 }