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 }