001    /*
002     *    GeoAPI - Java interfaces for OGC/ISO standards
003     *    http://www.geoapi.org
004     *
005     *    Copyright (C) 2006-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.referencing.cs;
033    
034    import java.util.List;
035    import java.util.ArrayList;
036    
037    import org.opengis.util.CodeList;
038    import org.opengis.annotation.UML;
039    
040    import static org.opengis.annotation.Obligation.*;
041    import static org.opengis.annotation.Specification.*;
042    
043    
044    /**
045     * Meaning of the axis value range specified through
046     * {@linkplain CoordinateSystemAxis#getMinimumValue minimum value} and
047     * {@linkplain CoordinateSystemAxis#getMaximumValue maximum value}.
048     *
049     * @author  Martin Desruisseaux (IRD)
050     * @version 3.0
051     * @since   2.1
052     *
053     * @see CoordinateSystemAxis#getRangeMeaning()
054     */
055    @UML(identifier="CS_RangeMeaning", specification=ISO_19111)
056    public final class RangeMeaning extends CodeList<RangeMeaning> {
057        /**
058         * Serial number for compatibility with different versions.
059         */
060        private static final long serialVersionUID = -3525560558294789416L;
061    
062        /**
063         * List of all enumerations of this type.
064         * Must be declared before any enum declaration.
065         */
066        private static final List<RangeMeaning> VALUES = new ArrayList<RangeMeaning>(2);
067    
068        /**
069         * Any value between and including {@linkplain CoordinateSystemAxis#getMinimumValue minimum value}
070         * and {@linkplain CoordinateSystemAxis#getMaximumValue maximum value} is valid.
071         */
072        @UML(identifier="exact", obligation=CONDITIONAL, specification=ISO_19111)
073        public static final RangeMeaning EXACT = new RangeMeaning("EXACT");
074    
075        /**
076         * The axis is continuous with values wrapping around at the
077         * {@linkplain CoordinateSystemAxis#getMinimumValue minimum value} and
078         * {@linkplain CoordinateSystemAxis#getMaximumValue maximum value}.
079         * Values with the same meaning repeat modulo the difference between maximum value and
080         * minimum value.
081         *
082         * <blockquote><font size="-1"><b>Example:</b> In a geographic CRS, longitude values are
083         * often defined with a finite extent (e.g., from -180 degrees to +180 degrees). The minimum
084         * and maximum longitude limits define a single line (on the ellipsoid, sphere, or cylinder),
085         * known as the anti-meridian, across which longitude values are discontinuous: as this line
086         * is crossed, longitude changes abruptly (e.g., going West from a little more than -180° to
087         * a little less than +180°).</font></blockquote>
088         */
089        @UML(identifier="wraparound", obligation=CONDITIONAL, specification=ISO_19111)
090        public static final RangeMeaning WRAPAROUND = new RangeMeaning("WRAPAROUND");
091    
092        /**
093         * Constructs an enum with the given name. The new enum is
094         * automatically added to the list returned by {@link #values}.
095         *
096         * @param name The enum name. This name must not be in use by an other enum of this type.
097         */
098        private RangeMeaning(final String name) {
099            super(name, VALUES);
100        }
101    
102        /**
103         * Returns the list of {@code RangeMeaning}s.
104         *
105         * @return The list of codes declared in the current JVM.
106         */
107        public static RangeMeaning[] values() {
108            synchronized (VALUES) {
109                return VALUES.toArray(new RangeMeaning[VALUES.size()]);
110            }
111        }
112    
113        /**
114         * Returns the list of enumerations of the same kind than this enum.
115         */
116        @Override
117        public RangeMeaning[] family() {
118            return values();
119        }
120    
121        /**
122         * Returns the range meaning that matches the given string, or returns a
123         * new one if none match it. More specifically, this methods returns the first instance for
124         * which <code>{@linkplain #name() name()}.{@linkplain String#equals equals}(code)</code>
125         * returns {@code true}. If no existing instance is found, then a new one is created for
126         * the given name.
127         *
128         * @param code The name of the code to fetch or to create.
129         * @return A code matching the given name.
130         */
131        public static RangeMeaning valueOf(String code) {
132            return valueOf(RangeMeaning.class, code);
133        }
134    }