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