001    /*
002     *    GeoAPI - Java interfaces for OGC/ISO standards
003     *    http://www.geoapi.org
004     *
005     *    Copyright (C) 2004-2012 Open Geospatial Consortium, Inc.
006     *    All Rights Reserved. http://www.opengeospatial.org/ogc/legal
007     *
008     *    Permission to use, copy, and modify this software and its documentation, with
009     *    or without modification, for any purpose and without fee or royalty is hereby
010     *    granted, provided that you include the following on ALL copies of the software
011     *    and documentation or portions thereof, including modifications, that you make:
012     *
013     *    1. The full text of this NOTICE in a location viewable to users of the
014     *       redistributed or derivative work.
015     *    2. Notice of any changes or modifications to the OGC files, including the
016     *       date changes were made.
017     *
018     *    THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
019     *    NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
020     *    TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
021     *    THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
022     *    PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
023     *
024     *    COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
025     *    CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
026     *
027     *    The name and trademarks of copyright holders may NOT be used in advertising or
028     *    publicity pertaining to the software without specific, written prior permission.
029     *    Title to copyright in this software and any associated documentation will at all
030     *    times remain with copyright holders.
031     */
032    package org.opengis.metadata;
033    
034    import java.util.List;
035    import java.util.ArrayList;
036    import org.opengis.util.CodeList;
037    import org.opengis.annotation.UML;
038    
039    import static org.opengis.annotation.Obligation.*;
040    import static org.opengis.annotation.Specification.*;
041    
042    
043    /**
044     * Datatype of element or entity.
045     *
046     * @author  Martin Desruisseaux (IRD)
047     * @version 3.0
048     * @since   2.0
049     */
050    @UML(identifier="MD_DatatypeCode", specification=ISO_19115)
051    public final class Datatype extends CodeList<Datatype> {
052        /**
053         * Serial number for compatibility with different versions.
054         */
055        private static final long serialVersionUID = -307310382687629669L;
056    
057        /**
058         * List of all enumerations of this type.
059         * Must be declared before any enum declaration.
060         */
061        private static final List<Datatype> VALUES = new ArrayList<Datatype>(15);
062    
063        /**
064         * Descriptor of a set of objects that share the same attributes, operations, methods,
065         * relationships, and behavior.
066         */
067        @UML(identifier="class", obligation=CONDITIONAL, specification=ISO_19115)
068        public static final Datatype CLASS = new Datatype("CLASS");
069    
070        /**
071         * Flexible enumeration useful for expressing a long list of values, can be extended.
072         */
073        @UML(identifier="codelist", obligation=CONDITIONAL, specification=ISO_19115)
074        public static final Datatype CODE_LIST = new Datatype("CODE_LIST");
075    
076        /**
077         * Data type whose instances form a list of named literal values, not extendable.
078         */
079        @UML(identifier="enumeration", obligation=CONDITIONAL, specification=ISO_19115)
080        public static final Datatype ENUMERATION = new Datatype("ENUMERATION");
081    
082        /**
083         * Permissible value for a codelist or enumeration.
084         */
085        @UML(identifier="codelistElement", obligation=CONDITIONAL, specification=ISO_19115)
086        public static final Datatype CODE_LIST_ELEMENT = new Datatype("CODE_LIST_ELEMENT");
087    
088        /**
089         * Class that cannot be directly instantiated.
090         */
091        @UML(identifier="abstractClass", obligation=CONDITIONAL, specification=ISO_19115)
092        public static final Datatype ABSTRACT_CLASS = new Datatype("ABSTRACT_CLASS");
093    
094        /**
095         * Class that is composed of classes it is connected to by an aggregate relationship.
096         */
097        @UML(identifier="aggregateClass", obligation=CONDITIONAL, specification=ISO_19115)
098        public static final Datatype AGGREGATE_CLASS = new Datatype("AGGREGATE_CLASS");
099    
100        /**
101         * Subclass that may be substituted for its superclass.
102         */
103        @UML(identifier="specifiedClass", obligation=CONDITIONAL, specification=ISO_19115)
104        public static final Datatype SPECIFIED_CLASS = new Datatype("SPECIFIED_CLASS");
105    
106        /**
107         * Class with few or no operations whose primary purpose is to hold the abstract state
108         * of another class for transmittal, storage, encoding or persistent storage.
109         */
110        @UML(identifier="datatypeClass", obligation=CONDITIONAL, specification=ISO_19115)
111        public static final Datatype DATATYPE_CLASS = new Datatype("DATATYPE_CLASS");
112    
113        /**
114         * Named set of operations that characterize the behavior of an element.
115         */
116        @UML(identifier="interfaceClass", obligation=CONDITIONAL, specification=ISO_19115)
117        public static final Datatype INTERFACE_CLASS = new Datatype("INTERFACE_CLASS");
118    
119        /**
120         * Class describing a selection of one of the specified types.
121         */
122        @UML(identifier="unionClass", obligation=CONDITIONAL, specification=ISO_19115)
123        public static final Datatype UNION_CLASS = new Datatype("UNION_CLASS");
124    
125        /**
126         * Class whose instances are classes.
127         */
128        @UML(identifier="metaClass", obligation=CONDITIONAL, specification=ISO_19115)
129        public static final Datatype META_CLASS = new Datatype("META_CLASS");
130    
131        /**
132         * Class used for specification of a domain of instances (objects), together with the
133         * operations applicable to the objects. A type may have attributes and associations.
134         */
135        @UML(identifier="typeClass", obligation=CONDITIONAL, specification=ISO_19115)
136        public static final Datatype TYPE_CLASS = new Datatype("TYPE_CLASS");
137    
138        /**
139         * Free text field.
140         */
141        @UML(identifier="characterString", obligation=CONDITIONAL, specification=ISO_19115)
142        public static final Datatype CHARACTER_STRING = new Datatype("CHARACTER_STRING");
143    
144        /**
145         * Numerical field.
146         */
147        @UML(identifier="integer", obligation=CONDITIONAL, specification=ISO_19115)
148        public static final Datatype INTEGER = new Datatype("INTEGER");
149    
150        /**
151         * Semantic relationship between two classes that involves connections among their instances.
152         */
153        @UML(identifier="association", obligation=CONDITIONAL, specification=ISO_19115)
154        public static final Datatype ASSOCIATION = new Datatype("ASSOCIATION");
155    
156        /**
157         * Constructs an enum with the given name. The new enum is
158         * automatically added to the list returned by {@link #values}.
159         *
160         * @param name The enum name. This name must not be in use by an other enum of this type.
161         */
162        private Datatype(final String name) {
163            super(name, VALUES);
164        }
165    
166        /**
167         * Returns the list of {@code Datatype}s.
168         *
169         * @return The list of codes declared in the current JVM.
170         */
171        public static Datatype[] values() {
172            synchronized (VALUES) {
173                return VALUES.toArray(new Datatype[VALUES.size()]);
174            }
175        }
176    
177        /**
178         * Returns the list of enumerations of the same kind than this enum.
179         */
180        @Override
181        public Datatype[] family() {
182            return values();
183        }
184    
185        /**
186         * Returns the datatype that matches the given string, or returns a
187         * new one if none match it. More specifically, this methods returns the first instance for
188         * which <code>{@linkplain #name() name()}.{@linkplain String#equals equals}(code)</code>
189         * returns {@code true}. If no existing instance is found, then a new one is created for
190         * the given name.
191         *
192         * @param code The name of the code to fetch or to create.
193         * @return A code matching the given name.
194         */
195        public static Datatype valueOf(String code) {
196            return valueOf(Datatype.class, code);
197        }
198    }