View Javadoc
1   /**
2    * Redistribution and use of this software and associated documentation ("Software"), with or
3    * without modification, are permitted provided that the following conditions are met:
4    *
5    * 1. Redistributions of source code must retain copyright statements and notices. Redistributions
6    * must also contain a copy of this document.
7    *
8    * 2. Redistributions in binary form must reproduce the above copyright notice, this list of
9    * conditions and the following disclaimer in the documentation and/or other materials provided with
10   * the distribution.
11   *
12   * 3. The name "Exolab" must not be used to endorse or promote products derived from this Software
13   * without prior written permission of Intalio, Inc. For written permission, please contact
14   * info@exolab.org.
15   *
16   * 4. Products derived from this Software may not be called "Exolab" nor may "Exolab" appear in
17   * their names without prior written permission of Intalio, Inc. Exolab is a registered trademark of
18   * Intalio, Inc.
19   *
20   * 5. Due credit should be given to the Exolab Project (http://www.exolab.org/).
21   *
22   * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR
23   * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
24   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTALIO, INC. OR ITS
25   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28   * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
29   * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30   *
31   * Copyright 1999-2002 (C) Intalio, Inc. All Rights Reserved.
32   */
33  package org.exolab.javasource;
34  
35  import java.util.Vector;
36  
37  import org.apache.commons.lang3.ArrayUtils;
38  
39  /**
40   * Describes the definition of a enum constant.
41   *
42   * @author <a href="mailto:andrew DOT fawcett AT coda DOT com">Andrew Fawcett</a>
43   * @version $Revision$ $Date: 2006-04-25 16:09:10 -0600 (Tue, 25 Apr 2006) $
44   */
45  public final class JEnumConstant extends JAnnotatedElementHelper implements JMember {
46    // --------------------------------------------------------------------------
47  
48    /** Name of this JEnumConstant. */
49    private String _name;
50  
51    /** Array of arguments provided to this JEnumConstant at initialization. May be null. */
52    private String[] _arguments;
53  
54    /** JavaDoc comment for this JEnumConstant. */
55    private JDocComment _comment = new JDocComment();
56  
57    /** A list of methods attached to this JEnumConstant. */
58    private final Vector<JMethod> _methods = new Vector<>();
59  
60    // --------------------------------------------------------------------------
61  
62    /**
63     * Constructs a JEnumConstant with a given name and no initialization arguements.
64     *
65     * @param name Name of the constant.
66     */
67    public JEnumConstant(final String name) {
68      this(name, null);
69    }
70  
71    /**
72     * Constructs a JEnumConstant with a given name and initialization arguments.
73     *
74     * @param name Name of the constant.
75     * @param arguments The initialization arguments provided.
76     */
77    public JEnumConstant(final String name, final String[] arguments) {
78      setName(name);
79  
80      _comment.appendComment("Constant " + name);
81      _arguments = arguments;
82    }
83  
84    // --------------------------------------------------------------------------
85  
86    /**
87     * Returns the modifiers for this JEnumConstant.
88     *
89     * @return The modifiers for this JEnumConstant.
90     */
91    public JModifiers getModifiers() {
92      throw new RuntimeException("Not implemented.");
93    }
94  
95    /**
96     * Sets the arguments specified by this constant.
97     *
98     * @param args Initialization arguments for this constant.
99     */
100   public void setArguments(final String[] args) {
101     _arguments = args;
102   }
103 
104   /**
105    * Returns the arguments used by this constant.
106    *
107    * @return The arguments used by this constant.
108    */
109   public String[] getArguments() {
110     return _arguments;
111   }
112 
113   /**
114    * Returns the amount of arguments.
115    * 
116    * @return The amount of arguments.
117    */
118   public int getArgumentCount() {
119     return _arguments.length;
120   }
121 
122   /**
123    * Adds the given JMethod to this JEnumConstant.
124    *
125    * @param jMethod The JMethod to add.
126    */
127   public void addMethod(final JMethod jMethod) {
128     addMethod(jMethod, true);
129   }
130 
131   /**
132    * Adds the given JMethod to this JEnumConstant.
133    *
134    * @param jMethod The JMethod to add.
135    * @param importReturnType True if we add the importReturnType to the class import lists. It could
136    *        be useful to set it to false when all types are fully qualified.
137    */
138   public void addMethod(final JMethod jMethod, final boolean importReturnType) {
139     if (jMethod == null) {
140       throw new IllegalArgumentException("Class methods cannot be null");
141     }
142 
143     // -- check method name and signatures *add later*
144 
145     // -- keep method list sorted for esthetics when printing
146     // -- START SORT :-)
147     boolean added = false;
148     JModifiers modifiers = jMethod.getModifiers();
149 
150     if (modifiers.isAbstract()) {
151       getModifiers().setAbstract(true);
152     }
153 
154     for (int i = 0; i < _methods.size(); i++) {
155       JMethod tmp = _methods.elementAt(i);
156       // -- first compare modifiers
157       if (tmp.getModifiers().isPrivate()) {
158         if (!modifiers.isPrivate()) {
159           _methods.insertElementAt(jMethod, i);
160           added = true;
161           break;
162         }
163       }
164       // -- compare names
165       if (jMethod.getName().compareTo(tmp.getName()) < 0) {
166         _methods.insertElementAt(jMethod, i);
167         added = true;
168         break;
169       }
170     }
171     // -- END SORT
172     if (!added) {
173       _methods.add(jMethod);
174     }
175   }
176 
177   /**
178    * Adds the given array of JMethods to this JEnumConstant.
179    *
180    * @param jMethods The array of JMethod to add.
181    */
182   public void addMethods(final JMethod[] jMethods) {
183     for (JMethod jMethod : jMethods) {
184       addMethod(jMethod);
185     }
186   }
187 
188   /**
189    * Returns an array of all the JMethods of this JMethod
190    *
191    * @return An array of all the JMethods of this JMethod.
192    */
193   public JMethod[] getMethods() {
194     return _methods.toArray(new JMethod[_methods.size()]);
195   }
196 
197   public int getMethodCount() {
198     return _methods.size();
199   }
200 
201   /**
202    * Returns the first occurance of the method with the given name, starting from the specified
203    * index.
204    *
205    * @param name The name of the method to look for.
206    * @param startIndex The starting index to begin the search.
207    * @return The method if found, otherwise null.
208    */
209   public JMethod getMethod(final String name, final int startIndex) {
210     for (JMethod jMethod : _methods) {
211       if (jMethod.getName().equals(name)) {
212         return jMethod;
213       }
214     }
215     return null;
216   }
217 
218   /**
219    * Returns the JMethod located at the specified index.
220    *
221    * @param index The index of the JMethod to return.
222    * @return The JMethod.
223    */
224   public JMethod getMethod(final int index) {
225     return _methods.elementAt(index);
226   }
227 
228   /**
229    * Sets the name of this JEnumConstant.
230    *
231    * @param name The name of this JEnumConstant.
232    */
233   public void setName(final String name) {
234     if (!JNaming.isValidJavaIdentifier(name)) {
235       String err = "'" + name + "' is ";
236       if (JNaming.isKeyword(name)) {
237         err += "a reserved word and may not be used as " + " a field name.";
238       } else {
239         err += "not a valid Java identifier.";
240       }
241       throw new IllegalArgumentException(err);
242     }
243     _name = name;
244   }
245 
246   /**
247    * Returns the name of this JEnumConstant.
248    *
249    * @return The name of this JEnumConstant.
250    */
251   public String getName() {
252     return _name;
253   }
254 
255   /**
256    * Sets the JavaDoc comment describing this JEnumConstant.
257    *
258    * @param comment The JavaDoc comment for this JEnumConstant.
259    */
260   public void setComment(final JDocComment comment) {
261     _comment = comment;
262   }
263 
264   /**
265    * Sets the JavaDoc comment describing this JEnumConstant.
266    *
267    * @param comment The JavaDoc comment for this JEnumConstant.
268    */
269   public void setComment(final String comment) {
270     if (_comment == null) {
271       _comment = new JDocComment();
272     }
273     _comment.setComment(comment);
274   }
275 
276   /**
277    * Returns the JavaDoc comment describing this JEnumConstant.
278    *
279    * @return The JavaDoc comment describing this JEnumConstant, or null if none has been set.
280    */
281   public JDocComment getComment() {
282     return _comment;
283   }
284 
285   // --------------------------------------------------------------------------
286 
287   /**
288    * prints this enum constant.
289    *
290    * @param jsw The JSourceWriter to print to. Must not be null.
291    */
292   public void print(final JSourceWriter jsw) {
293     // -- print comments
294     if (_comment != null) {
295       _comment.print(jsw);
296     }
297     // -- print annotation
298     if (printAnnotations(jsw)) {
299       jsw.writeln();
300     }
301     // -- print name
302     jsw.write(_name);
303     // -- print arguments
304     if (_arguments != null && _arguments.length > 0) {
305       jsw.write("(");
306       for (int a = 0; a < _arguments.length; a++) {
307         jsw.write(_arguments[a]);
308         if (a < _arguments.length - 1) {
309           jsw.write(", ");
310         }
311       }
312       jsw.write(")");
313     }
314     // -- print methods
315     if (!_methods.isEmpty()) {
316       jsw.write(" {");
317       jsw.writeln();
318       jsw.indent();
319       for (int i = 0; i < _methods.size(); i++) {
320         JMethod jMethod = _methods.elementAt(i);
321         jMethod.print(jsw);
322         if (i < _methods.size() - 1) {
323           jsw.writeln();
324         }
325       }
326       jsw.unindent();
327       jsw.write("}");
328     }
329   }
330 
331   // --------------------------------------------------------------------------
332 }