1 /*
2  *    GeoAPI - Java interfaces for OGC/ISO standards
3  *    http://www.geoapi.org
4  *
5  *    Copyright (C) 2004-2011 Open Geospatial Consortium, Inc.
6  *    All Rights Reserved. http://www.opengeospatial.org/ogc/legal
7  *
8  *    Permission to use, copy, and modify this software and its documentation, with
9  *    or without modification, for any purpose and without fee or royalty is hereby
10  *    granted, provided that you include the following on ALL copies of the software
11  *    and documentation or portions thereof, including modifications, that you make:
12  *
13  *    1. The full text of this NOTICE in a location viewable to users of the
14  *       redistributed or derivative work.
15  *    2. Notice of any changes or modifications to the OGC files, including the
16  *       date changes were made.
17  *
18  *    THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
19  *    NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
20  *    TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
21  *    THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
22  *    PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
23  *
24  *    COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
25  *    CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
26  *
27  *    The name and trademarks of copyright holders may NOT be used in advertising or
28  *    publicity pertaining to the software without specific, written prior permission.
29  *    Title to copyright in this software and any associated documentation will at all
30  *    times remain with copyright holders.
31  */
32 package org.opengis.metadata;
33 
34 import java.util.List;
35 import java.util.ArrayList;
36 import org.opengis.util.CodeList;
37 import org.opengis.annotation.UML;
38 
39 import static org.opengis.annotation.Obligation.*;
40 import static org.opengis.annotation.Specification.*;
41 
42 
43 /**
44  * Datatype of element or entity.
45  *
46  * @author  Martin Desruisseaux (IRD)
47  * @version 3.0
48  * @since   2.0
49  */
50 @UML(identifier="MD_DatatypeCode", specification=ISO_19115)
51 public final class Datatype extends CodeList<Datatype> {
52     /**
53      * Serial number for compatibility with different versions.
54      */
55     private static final long serialVersionUID = -307310382687629669L;
56 
57     /**
58      * List of all enumerations of this type.
59      * Must be declared before any enum declaration.
60      */
61     private static final List<Datatype> VALUES = new ArrayList<Datatype>(15);
62 
63     /**
64      * Descriptor of a set of objects that share the same attributes, operations, methods,
65      * relationships, and behavior.
66      */
67     @UML(identifier="class", obligation=CONDITIONAL, specification=ISO_19115)
68     public static final Datatype CLASS = new Datatype("CLASS");
69 
70     /**
71      * Flexible enumeration useful for expressing a long list of values, can be extended.
72      */
73     @UML(identifier="codelist", obligation=CONDITIONAL, specification=ISO_19115)
74     public static final Datatype CODE_LIST = new Datatype("CODE_LIST");
75 
76     /**
77      * Data type whose instances form a list of named literal values, not extendable.
78      */
79     @UML(identifier="enumeration", obligation=CONDITIONAL, specification=ISO_19115)
80     public static final Datatype ENUMERATION = new Datatype("ENUMERATION");
81 
82     /**
83      * Permissible value for a codelist or enumeration.
84      */
85     @UML(identifier="codelistElement", obligation=CONDITIONAL, specification=ISO_19115)
86     public static final Datatype CODE_LIST_ELEMENT = new Datatype("CODE_LIST_ELEMENT");
87 
88     /**
89      * Class that cannot be directly instantiated.
90      */
91     @UML(identifier="abstractClass", obligation=CONDITIONAL, specification=ISO_19115)
92     public static final Datatype ABSTRACT_CLASS = new Datatype("ABSTRACT_CLASS");
93 
94     /**
95      * Class that is composed of classes it is connected to by an aggregate relationship.
96      */
97     @UML(identifier="aggregateClass", obligation=CONDITIONAL, specification=ISO_19115)
98     public static final Datatype AGGREGATE_CLASS = new Datatype("AGGREGATE_CLASS");
99 
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      */
Datatype(final String name)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      */
values()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      */
family()180     public Datatype[] family() {
181         return values();
182     }
183 
184     /**
185      * Returns the datatype that matches the given string, or returns a
186      * new one if none match it.
187      *
188      * @param code The name of the code to fetch or to create.
189      * @return A code matching the given name.
190      */
valueOf(String code)191     public static Datatype valueOf(String code) {
192         return valueOf(Datatype.class, code);
193     }
194 }
195