View Javadoc
1   /**
2    * Redistribution and use of this software and associated documentation
3    * ("Software"), with or without modification, are permitted provided
4    * that the following conditions are met:
5    *
6    * 1. Redistributions of source code must retain copyright
7    *    statements and notices.  Redistributions must also contain a
8    *    copy of this document.
9    *
10   * 2. Redistributions in binary form must reproduce the
11   *    above copyright notice, this list of conditions and the
12   *    following disclaimer in the documentation and/or other
13   *    materials provided with the distribution.
14   *
15   * 3. The name "Exolab" must not be used to endorse or promote
16   *    products derived from this Software without prior written
17   *    permission of Intalio, Inc.  For written permission,
18   *    please contact info@exolab.org.
19   *
20   * 4. Products derived from this Software may not be called "Exolab"
21   *    nor may "Exolab" appear in their names without prior written
22   *    permission of Intalio, Inc. Exolab is a registered
23   *    trademark of Intalio, Inc.
24   *
25   * 5. Due credit should be given to the Exolab Project
26   *    (http://www.exolab.org/).
27   *
28   * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
29   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
32   * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39   * OF THE POSSIBILITY OF SUCH DAMAGE.
40   *
41   * Copyright 1999-2002 (C) Intalio, Inc. All Rights Reserved.
42   */
43  package org.exolab.javasource;
44  
45  import java.util.LinkedHashMap;
46  import java.util.Map;
47  
48  import org.exolab.castor.builder.SourceGenerator;
49  
50  /**
51   * Describes the definition of a annotation type class.
52   *
53   * <pre>
54   *   JAnnotationType type = new JAnnotationType("RequestForEnhancement");
55   *   type.addElement(new JAnnotationTypeElement("id", JType.Int));
56   *   type.addElement(new JAnnotationTypeElement("synopsis", new JType("String")));
57   *   JAnnotationTypeElement engineer;
58   *   engineer = new JAnnotationTypeElement("engineer", new JType("String"));
59   *   engineer.setDefaultString("\"[unassigned]\"");
60   *   type.addElement(engineer);
61   *   JAnnotationTypeElement date;
62   *   date = new JAnnotationTypeElement("date", new JType("String"));
63   *   date.setDefaultString("\"[unimplemented]\"");
64   *   type.addElement(date);
65   * </pre>
66   *
67   *  outputs
68   *
69   * <pre>
70   *   public &#064;interface RequestForEnhancement {
71   *       int id();
72   *       String synopsis();
73   *       String engineer() default "[unassigned]";
74   *       String date() default "[unimplemented]";
75   *   }
76   * </pre>
77   *
78   * @author <a href="mailto:andrew DOT fawcett AT coda DOT com">Andrew Fawcett</a>
79   * @version $Revision$ $Date: 2006-04-25 16:09:10 -0600 (Tue, 25 Apr 2006) $
80   */
81  public final class JAnnotationType extends JStructure {
82  
83      /** The list of elements of this JAnnotationType. */
84      private Map<String, JAnnotationTypeElement> _elements = 
85          new LinkedHashMap<String, JAnnotationTypeElement>();
86  
87      /**
88       * Creates a JAnnotationType of the given name.
89       *
90       * @param name Annotation name.
91       */
92      public JAnnotationType(final String name) {
93          super(name);
94          
95          //-- initialize default Java doc
96          getJDocComment().appendComment("Annotation " + getLocalName() + ".");
97      }
98  
99      /**
100      * {@inheritDoc}
101      */
102     public void addImport(final String className) {
103         if (className == null || className.length() == 0) { return; }
104         addImportInternal(className);
105     }
106 
107     /**
108      * Adds the given JMember to this JAnnotationType.
109      *
110      * @param jMember The JMember to add.
111      */
112     public void addMember(final JMember jMember) {
113         if (!(jMember instanceof JAnnotationTypeElement)) {
114             throw new IllegalArgumentException("Must be a JAnnotationTypeElement.");
115         }
116         addElement((JAnnotationTypeElement) jMember);
117     }
118 
119     /**
120      * Returns an Array containing all our JAnnotationTypeElements.
121      *
122      * @return An Array containing all our JAnnotationTypeElements.
123      */
124     public JAnnotationTypeElement[] getElements() {
125         return _elements.values().toArray(new JAnnotationTypeElement[_elements.size()]);
126     }
127 
128     /**
129      * Returns the member with the given name, or null if no member was found
130      * with the given name.
131      *
132      * @param name The name of the member to return.
133      * @return The member with the given name, or null if no member was found
134      *         with the given name.
135      */
136     public JAnnotationTypeElement getElement(final String name) {
137         return _elements.get(name);
138     }
139 
140     /**
141      * Adds the given JAnnotationTypeElement to this JAnnotationType.
142      *
143      * @param jElement The element to add.
144      */
145     public void addElement(final JAnnotationTypeElement jElement) {
146         if (jElement == null) {
147             throw new IllegalArgumentException("Class members cannot be null");
148         }
149 
150         String name = jElement.getName();
151         if (_elements.get(name) != null) {
152             String err = "duplicate name found: " + name;
153             throw new IllegalArgumentException(err);
154         }
155         _elements.put(name, jElement);
156 
157         // if member is of a type not imported by this class
158         // then add import
159         JType type = jElement.getType();
160         while (type.isArray()) {
161             type = ((JArrayType) type).getComponentType();
162         }
163         if (!type.isPrimitive()) {
164             addImport(type.getName());
165         }
166     }
167 
168     /**
169      * Not implemented. Always throws a RuntimeException.
170      * <br/>
171      * {@inheritDoc}
172      */
173     public JField[] getFields() {
174         throw new RuntimeException("Not implemented.");
175     }
176 
177     /**
178      * Not implemented. Always throws a RuntimeException.
179      * <br/>
180      * {@inheritDoc}
181      */
182     public JField getField(final String name) {
183         throw new RuntimeException("Not implemented.");
184     }
185 
186     /**
187      * Not implemented. Always throws a RuntimeException.
188      * <br/>
189      * {@inheritDoc}
190      */
191     public void addField(final JField jField) {
192         throw new RuntimeException("Not implemented.");
193     }
194 
195     /**
196      * {@inheritDoc}
197      * 
198      * @deprecated Please use the Velocity-template based approach instead.
199      * @see SourceGenerator#setJClassPrinterType(String) 
200      */
201     public void print(final JSourceWriter jsw) {
202         if (jsw == null) {
203             throw new IllegalArgumentException("argument 'jsw' should not be null.");
204         }
205 
206         StringBuilder buffer = new StringBuilder(100);
207 
208         printHeader(jsw);
209         printPackageDeclaration(jsw);
210         printImportDeclarations(jsw);
211 
212         //------------/
213         //- Java Doc -/
214         //------------/
215 
216         getJDocComment().print(jsw);
217 
218         //-- print class information
219         //-- we need to add some JavaDoc API adding comments
220 
221         buffer.setLength(0);
222         JModifiers modifiers = getModifiers();
223         if (modifiers.isPrivate()) {
224             buffer.append("private ");
225         } else if (modifiers.isPublic()) {
226             buffer.append("public ");
227         }
228         buffer.append("@interface ");
229         buffer.append(getLocalName());
230         buffer.append(' ');
231         buffer.append('{');
232         jsw.writeln(buffer.toString());
233 
234         //-- declare members
235 
236         buffer.setLength(0);
237         jsw.writeln();
238         jsw.indent();
239         for (JAnnotationTypeElement jElement :_elements.values()) {
240             jElement.print(jsw);
241             jsw.writeln();
242         }
243         jsw.unindent();
244 
245         // -- close class
246 
247         jsw.writeln('}');
248         jsw.flush();
249     }
250 
251 }