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(0); 110 } 111 112 ensureUniqueAndAddIfSo(m_enums, info); 113 } 114 } 115 }