1/*
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package com.sun.codemodel.internal;
27
28import java.util.Iterator;
29
30/**
31 * The common aspect of a package and a class.
32 */
33public interface JClassContainer {
34
35    /**
36     * Returns true if the container is a class.
37     */
38    boolean isClass();
39    /**
40     * Returns true if the container is a package.
41     */
42    boolean isPackage();
43
44    /**
45     * Add a new class to this package/class.
46     *
47     * @param mods
48     *        Modifiers for this class declaration
49     *
50     * @param name
51     *        Name of class to be added to this package
52     *
53     * @return Newly generated class
54     *
55     * @exception JClassAlreadyExistsException
56     *      When the specified class/interface was already created.
57     */
58    JDefinedClass _class(int mods, String name) throws JClassAlreadyExistsException;
59
60    /**
61     * Add a new public class to this class/package.
62     *
63     * @exception JClassAlreadyExistsException
64     *      When the specified class/interface was already created.
65     */
66    public JDefinedClass _class(String name) throws JClassAlreadyExistsException;
67
68    /**
69     * Add an interface to this class/package.
70     *
71     * @param mods
72     *        Modifiers for this interface declaration
73     *
74     * @param name
75     *        Name of interface to be added to this package
76     *
77     * @return Newly generated interface
78     *
79     * @exception JClassAlreadyExistsException
80     *      When the specified class/interface was already created.
81     */
82    public JDefinedClass _interface(int mods, String name) throws JClassAlreadyExistsException;
83
84    /**
85     * Adds a public interface to this package.
86     *
87     * @exception JClassAlreadyExistsException
88     *      When the specified class/interface was already created.
89     */
90    public JDefinedClass _interface(String name) throws JClassAlreadyExistsException;
91
92    /**
93     * Create a new class or a new interface.
94     *
95     * @deprecated
96     *      use {@link #_class(int, String, ClassType)}
97     */
98    public JDefinedClass _class(int mods, String name, boolean isInterface )
99        throws JClassAlreadyExistsException;
100
101    /**
102     * Creates a new class/enum/interface/annotation.
103     */
104    public JDefinedClass _class(int mods, String name, ClassType kind )
105        throws JClassAlreadyExistsException;
106
107
108    /**
109     * Returns an iterator that walks the nested classes defined in this
110     * class.
111     */
112    public Iterator<JDefinedClass> classes();
113
114    /**
115     * Parent JClassContainer.
116     *
117     * If this is a package, this method returns a parent package,
118     * or null if this package is the root package.
119     *
120     * If this is an outer-most class, this method returns a package
121     * to which it belongs.
122     *
123     * If this is an inner class, this method returns the outer
124     * class.
125     */
126    public JClassContainer parentContainer();
127
128    /**
129     * Gets the nearest package parent.
130     *
131     * <p>
132     * If {@code this.isPackage()}, then return {@code this}.
133     */
134    public JPackage getPackage();
135
136    /**
137     * Get the root code model object.
138     */
139    public JCodeModel owner();
140
141    /**
142     * Add an annotationType Declaration to this package
143     * @param name
144     *      Name of the annotation Type declaration to be added to this package
145     * @return
146     *      newly created Annotation Type Declaration
147     * @exception JClassAlreadyExistsException
148     *      When the specified class/interface was already created.
149
150     */
151    public JDefinedClass _annotationTypeDeclaration(String name) throws JClassAlreadyExistsException;
152
153    /**
154     * Add a public enum to this package
155     * @param name
156     *      Name of the enum to be added to this package
157     * @return
158     *      newly created Enum
159     * @exception JClassAlreadyExistsException
160     *      When the specified class/interface was already created.
161
162     */
163    public JDefinedClass _enum (String name) throws JClassAlreadyExistsException;
164
165}
166