001    /*
002     * file ListClassesVisitor.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.sun.mirror.util.DeclarationVisitors.NO_OP;
016    import static com.sun.mirror.util.DeclarationVisitors.getSourceOrderDeclarationScanner;
017    
018    import java.io.File;
019    import java.io.IOException;
020    import java.io.PrintWriter;
021    import java.util.Collection;
022    import java.util.Map;
023    import java.util.Map.Entry;
024    
025    
026    import com.ibm.rational.wvcm.stpex.annotation.RpcEnum;
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.AnnotationMirror;
031    import com.sun.mirror.declaration.AnnotationTypeElementDeclaration;
032    import com.sun.mirror.declaration.AnnotationValue;
033    import com.sun.mirror.declaration.ClassDeclaration;
034    import com.sun.mirror.type.AnnotationType;
035    import com.sun.mirror.util.SimpleDeclarationVisitor;
036    
037    public class ListClassesVisitor extends SimpleDeclarationVisitor 
038    {
039        static final String INDENT = "    ";
040        static final String ID_NAME = "id";
041        static final String NS_NAME = "ns";
042        static final String SIMPLE_NAME = "simpleName";
043        
044        private final AnnotationProcessorEnvironment m_env;
045        
046        public ListClassesVisitor(AnnotationProcessorEnvironment env)
047        {
048            //System.out.println("Creating ListClassesVisitor");
049            m_env = env;
050        }
051    
052        @Override
053        public void visitClassDeclaration(ClassDeclaration c) 
054        {
055            //System.out.println("Visiting Class: " + c.getQualifiedName());
056            
057            StpVisitor visitor = null;
058            
059            if (c.getQualifiedName().equals("com.ibm.rational.stp.cs.internal.util.XmlTag")) {
060            
061                visitor =  new XmlTagVisitor(m_env);
062            }
063            else if (c.getQualifiedName().equals("com.ibm.rational.stp.cs.internal.util.XmlNs")) {
064                
065                visitor =  new XmlNsVisitor(m_env);
066            }
067            else if (c.getQualifiedName().equals("com.ibm.rational.wvcm.stp.StpProvider.Domain")) {
068                
069                visitor = new ProviderDomainVisitor(m_env);
070            }
071            else if (c.getQualifiedName().equals("com.ibm.rational.wvcm.stp.StpLocation.Namespace")) {
072                
073                visitor = new StpLocationNamespaceVisitor(m_env);
074            }
075            else if (c.getQualifiedName().equals("com.ibm.rational.wvcm.stp.StpException.StpReasonCode")) {
076                
077                visitor = new StpExceptionStpReasonCodeVisitor(m_env);
078            }
079            
080            if (visitor != null) {
081                visitor.begin();
082                c.accept(getSourceOrderDeclarationScanner(NO_OP, (SimpleDeclarationVisitor)visitor));
083                visitor.end();
084            }
085        }
086        
087        static TagInfo getRpcEnumValues(Collection<AnnotationMirror> amirrors)
088        {
089            for (AnnotationMirror am : amirrors) {
090    
091                try {
092                    String name = am.getAnnotationType().getDeclaration().getQualifiedName();
093                    
094                    if (name.equals(RpcEnum.class.getName())) {
095                        return getRpcValues(am);
096                    }
097                }
098                catch (ClassCastException e) {
099    
100                    System.err.println("Error: encoutnered unknown annotation" + am.getPosition().toString());
101                }
102            }
103            
104            return null;
105        }
106        
107        static TagInfo getRpcValues(AnnotationMirror am) 
108        {
109            TagInfo info = new TagInfo();
110            
111            Map<AnnotationTypeElementDeclaration, AnnotationValue> values = am.getElementValues();
112    
113            info.position = am.getPosition().toString();
114            
115            for (Entry<AnnotationTypeElementDeclaration, AnnotationValue> entry : values.entrySet()) {
116                
117                if (entry.getKey().getSimpleName().equals(ID_NAME)) {
118                    info.id = entry.getValue().toString();
119                }
120                else if (entry.getKey().getSimpleName().equals(NS_NAME)) {
121                    info.ns = (String)entry.getValue().getValue();
122                }
123                else if (entry.getKey().getSimpleName().equals(SIMPLE_NAME)) {
124                    info.simple = (String)entry.getValue().getValue();
125                }
126            }
127            
128            return info;
129        }
130        
131        static void ensureUniqueAndAddIfSo(Map<Integer, TagInfo> map, TagInfo info) 
132        {
133            int intValue = Integer.parseInt(info.id);
134            
135            if (map.containsKey(intValue)) {
136                
137                System.err.println("Error: For enum '" + info.fieldName + 
138                                   "' RpcEnumId value '" + intValue + 
139                                   "' is already defined for enum '" + 
140                                   map.get(intValue).fieldName); 
141                System.err.println("Existing pos: " + info.position);
142                System.err.println("Current pos: " + info.position);
143                System.err.println("Error: exiting unexpectedly");
144                System.exit(1);
145            }
146            else {
147                map.put(intValue, info);
148            }
149        }
150        
151        static PrintWriter createFile(Filer filer, String fileName)
152        {
153            System.out.println("Creating file: " + fileName);
154            try {
155                return filer.createTextFile(Filer.Location.SOURCE_TREE, 
156                                            /*package*/"", 
157                                            new File(fileName), 
158                                            /*charset*/null);
159            }
160            catch (IOException e) {
161                e.printStackTrace();
162                System.err.println("Error: exiting unexpectedly");
163                System.exit(1);
164            }
165            
166            return null;
167        }
168        
169        static void writeCommonHeader(PrintWriter pw, Object o)
170        {
171            pw.println("/**");
172            pw.println(" * Do not modify this file. This is a generated file");
173            pw.println(" * Generated By: " + o.getClass().getName());
174            pw.println(" */");
175        }
176    }