001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common Development
008: * and Distribution License("CDDL") (collectively, the "License"). You
009: * may not use this file except in compliance with the License. You can obtain
010: * a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
011: * or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
012: * language governing permissions and limitations under the License.
013: *
014: * When distributing the software, include this License Header Notice in each
015: * file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
016: * Sun designates this particular file as subject to the "Classpath" exception
017: * as provided by Sun in the GPL Version 2 section of the License file that
018: * accompanied this code. If applicable, add the following below the License
019: * Header, with the fields enclosed by brackets [] replaced by your own
020: * identifying information: "Portions Copyrighted [year]
021: * [name of copyright owner]"
022: *
023: * Contributor(s):
024: *
025: * If you wish your version of this file to be governed by only the CDDL or
026: * only the GPL Version 2, indicate your decision by adding "[Contributor]
027: * elects to include this software in this distribution under the [CDDL or GPL
028: * Version 2] license." If you don't indicate a single choice of license, a
029: * recipient has the option to distribute your version of this file under
030: * either the CDDL, the GPL Version 2 or to extend the choice of license to
031: * its licensees as provided above. However, if you add GPL Version 2 code
032: * and therefore, elected the GPL Version 2 license, then the option applies
033: * only if the new code is made subject to such option by the copyright
034: * holder.
035: */
036:
037: package com.sun.xml.bind.v2.model.core;
038:
039: import java.util.List;
040:
041: import javax.xml.bind.annotation.XmlTransient;
042: import javax.xml.bind.annotation.XmlValue;
043:
044: /**
045: * Information about JAXB-bound class.
046: *
047: * <p>
048: * All the JAXB annotations are already reflected to the model so that
049: * the caller doesn't have to worry about them. For this reason, you
050: * cannot access annotations on properties.
051: *
052: * <h2>XML representation</h2>
053: * <p>
054: * A JAXB-bound class always have at least one representation
055: * (called "type representation"),but it can optionally have another
056: * representation ("element representation").
057: *
058: * <p>
059: * In the type representaion, a class
060: * is represented as a set of attributes and (elements or values).
061: * You can inspect the details of those attributes/elements/values by {@link #getProperties()}.
062: * This representation corresponds to a complex/simple type in XML Schema.
063: * You can obtain the schema type name by {@link #getTypeName()}.
064: *
065: * <p>
066: * If a class has an element representation, {@link #isElement()} returns true.
067: * This representation is mostly similar to the type representation
068: * except that the whoe attributes/elements/values are wrapped into
069: * one element. You can obtain the name of this element through {@link #asElement()}.
070: *
071: * @author Kohsuke Kawaguchi (kk@kohsuke.org)
072: */
073: public interface ClassInfo<T, C> extends MaybeElement<T, C> {
074:
075: /**
076: * Obtains the information about the base class.
077: *
078: * @return null
079: * if this info extends from {@link Object}.
080: */
081: ClassInfo<T, C> getBaseClass();
082:
083: /**
084: * Gets the declaration this object is wrapping.
085: */
086: C getClazz();
087:
088: /**
089: * Gets the fully-qualified name of the class.
090: */
091: String getName();
092:
093: /**
094: * Returns all the properties newly declared in this class.
095: *
096: * <p>
097: * This excludes properties defined in the super class.
098: *
099: * <p>
100: * If the properties are {@link #isOrdered() ordered},
101: * it will be returned in the order that appear in XML.
102: * Otherwise it will be returned in no particular order.
103: *
104: * <p>
105: * Properties marked with {@link XmlTransient} will not show up
106: * in this list. As far as JAXB is concerned, they are considered
107: * non-existent.
108: *
109: * @return
110: * always non-null, but can be empty.
111: */
112: List<? extends PropertyInfo<T, C>> getProperties();
113:
114: /**
115: * Returns true if this class or its ancestor has {@link XmlValue}
116: * property.
117: */
118: boolean hasValueProperty();
119:
120: /**
121: * Gets the property that has the specified name.
122: *
123: * <p>
124: * This is just a convenience method for:
125: * <pre>
126: * for( PropertyInfo p : getProperties() ) {
127: * if(p.getName().equals(name))
128: * return p;
129: * }
130: * return null;
131: * </pre>
132: *
133: * @return null
134: * if the property was not found.
135: *
136: * @see PropertyInfo#getName()
137: */
138: PropertyInfo<T, C> getProperty(String name);
139:
140: /**
141: * If the class has properties, return true. This is only
142: * true if the Collection object returned by {@link #getProperties()}
143: * is not empty.
144: */
145: boolean hasProperties();
146:
147: /**
148: * If this class is abstract and thus shall never be directly instanciated.
149: */
150: boolean isAbstract();
151:
152: /**
153: * Returns true if the properties of this class is ordered in XML.
154: * False if it't not.
155: *
156: * <p>
157: * In RELAX NG context, ordered properties mean <group> and
158: * unordered properties mean <interleave>.
159: */
160: boolean isOrdered();
161:
162: /**
163: * If this class is marked as final and no further extension/restriction is allowed.
164: */
165: boolean isFinal();
166:
167: /**
168: * True if there's a known sub-type of this class in {@link TypeInfoSet}.
169: */
170: boolean hasSubClasses();
171:
172: /**
173: * Returns true if this bean class has an attribute wildcard.
174: *
175: * <p>
176: * This is true if the class declares an attribute wildcard,
177: * or it is inherited from its super classes.
178: *
179: * @see #inheritsAttributeWildcard()
180: */
181: boolean hasAttributeWildcard();
182:
183: /**
184: * Returns true iff this class inherits a wildcard attribute
185: * from its ancestor classes.
186: */
187: boolean inheritsAttributeWildcard();
188:
189: /**
190: * Returns true iff this class declares a wildcard attribute.
191: */
192: boolean declaresAttributeWildcard();
193: }
|