001    /*
002     *    GeoAPI - Java interfaces for OGC/ISO standards
003     *    http://www.geoapi.org
004     *
005     *    Copyright (C) 2004-2013 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.distribution;
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     * Name of the medium.
045     *
046     * @author  Martin Desruisseaux (IRD)
047     * @version 3.0
048     * @since   2.0
049     */
050    @UML(identifier="MD_MediumNameCode", specification=ISO_19115)
051    public final class MediumName extends CodeList<MediumName> {
052        /**
053         * Serial number for compatibility with different versions.
054         */
055        private static final long serialVersionUID = 2634504971646621701L;
056    
057        /**
058         * List of all enumerations of this type.
059         * Must be declared before any enum declaration.
060         */
061        private static final List<MediumName> VALUES = new ArrayList<MediumName>(18);
062    
063        /**
064         * Read-only optical disk.
065         */
066        @UML(identifier="cdRom", obligation=CONDITIONAL, specification=ISO_19115)
067        public static final MediumName CD_ROM = new MediumName("CD_ROM");
068    
069        /**
070         * Digital versatile disk.
071         */
072        @UML(identifier="dvd", obligation=CONDITIONAL, specification=ISO_19115)
073        public static final MediumName DVD = new MediumName("DVD");
074    
075        /**
076         * Digital versatile disk digital versatile disk, read only.
077         */
078        @UML(identifier="dvdRom", obligation=CONDITIONAL, specification=ISO_19115)
079        public static final MediumName DVD_ROM = new MediumName("DVD_ROM");
080    
081        /**
082         * 3&frac12; inch magnetic disk.
083         */
084        @UML(identifier="3halfInchFloppy", obligation=CONDITIONAL, specification=ISO_19115)
085        public static final MediumName FLOPPY_3_HALF_INCH = new MediumName("FLOPPY_3_HALF_INCH");
086    
087        /**
088         * 5&frac14; inch magnetic disk.
089         */
090        @UML(identifier="5quarterInchFloppy", obligation=CONDITIONAL, specification=ISO_19115)
091        public static final MediumName FLOPPY_5_QUARTER_INCH = new MediumName("FLOPPY_5_QUARTER_INCH");
092    
093        /**
094         * 7 track magnetic tape.
095         */
096        @UML(identifier="7trackTape", obligation=CONDITIONAL, specification=ISO_19115)
097        public static final MediumName TAPE_7_TRACK = new MediumName("TAPE_7_TRACK");
098    
099        /**
100         * 9 track magnetic tape.
101         */
102        @UML(identifier="9trackTape", obligation=CONDITIONAL, specification=ISO_19115)
103        public static final MediumName TAPE_9_TRACK = new MediumName("TAPE_9_TRACK");
104    
105        /**
106         * 3480 cartridge tape drive.
107         */
108        @UML(identifier="3480Cartridge", obligation=CONDITIONAL, specification=ISO_19115)
109        public static final MediumName CARTRIDGE_3480 = new MediumName("CARTRIDGE_3480");
110    
111        /**
112         * 3490 cartridge tape drive.
113         */
114        @UML(identifier="3490Cartridge", obligation=CONDITIONAL, specification=ISO_19115)
115        public static final MediumName CARTRIDGE_3490 = new MediumName("CARTRIDGE_3490");
116    
117        /**
118         * 3580 cartridge tape drive.
119         */
120        @UML(identifier="3580Cartridge", obligation=CONDITIONAL, specification=ISO_19115)
121        public static final MediumName CARTRIDGE_3580 = new MediumName("CARTRIDGE_3580");
122    
123        /**
124         * 4 millimetre magnetic tape.
125         */
126        @UML(identifier="4mmCartridgeTape", obligation=CONDITIONAL, specification=ISO_19115)
127        public static final MediumName CARTRIDGE_TAPE_4mm = new MediumName("CARTRIDGE_TAPE_4mm");
128    
129        /**
130         * 8 millimetre magnetic tape.
131         */
132        @UML(identifier="8mmCartridgeTape", obligation=CONDITIONAL, specification=ISO_19115)
133        public static final MediumName CARTRIDGE_TAPE_8mm = new MediumName("CARTRIDGE_TAPE_8mm");
134    
135        /**
136         * &frac14; inch magnetic tape.
137         */
138        @UML(identifier="1quarterInchCartridgeTape", obligation=CONDITIONAL, specification=ISO_19115)
139        public static final MediumName CARTRIDGE_TAPE_1_QUARTER_INCH = new MediumName("CARTRIDGE_TAPE_1_QUARTER_INCH");
140    
141        /**
142         * Half inch cartridge streaming tape drive.
143         */
144        @UML(identifier="digitalLinearTape", obligation=CONDITIONAL, specification=ISO_19115)
145        public static final MediumName DIGITAL_LINEAR_TAPE = new MediumName("DIGITAL_LINEAR_TAPE");
146    
147        /**
148         * Direct computer linkage.
149         */
150        @UML(identifier="onLine", obligation=CONDITIONAL, specification=ISO_19115)
151        public static final MediumName ON_LINE = new MediumName("ON_LINE");
152    
153        /**
154         * Linkage through a satellite communication system.
155         */
156        @UML(identifier="satellite", obligation=CONDITIONAL, specification=ISO_19115)
157        public static final MediumName SATELLITE = new MediumName("SATELLITE");
158    
159        /**
160         * Communication through a telephone network.
161         */
162        @UML(identifier="telephoneLink", obligation=CONDITIONAL, specification=ISO_19115)
163        public static final MediumName TELEPHONE_LINK = new MediumName("TELEPHONE_LINK");
164    
165        /**
166         * Pamphlet or leaflet giving descriptive information.
167         */
168        @UML(identifier="hardcopy", obligation=CONDITIONAL, specification=ISO_19115)
169        public static final MediumName HARDCOPY = new MediumName("HARDCOPY");
170    
171        /**
172         * Constructs an element of the given name. The new element is
173         * automatically added to the list returned by {@link #values()}.
174         *
175         * @param name The name of the new element.
176         *        This name must not be in use by an other element of this type.
177         */
178        private MediumName(final String name) {
179            super(name, VALUES);
180        }
181    
182        /**
183         * Returns the list of {@code MediumName}s.
184         *
185         * @return The list of codes declared in the current JVM.
186         */
187        public static MediumName[] values() {
188            synchronized (VALUES) {
189                return VALUES.toArray(new MediumName[VALUES.size()]);
190            }
191        }
192    
193        /**
194         * Returns the list of codes of the same kind than this code list element.
195         * Invoking this method is equivalent to invoking {@link #values()}, except that
196         * this method can be invoked on an instance of the parent {@code CodeList} class.
197         */
198        @Override
199        public MediumName[] family() {
200            return values();
201        }
202    
203        /**
204         * Returns the medium name that matches the given string, or returns a
205         * new one if none match it. More specifically, this methods returns the first instance for
206         * which <code>{@linkplain #name() name()}.{@linkplain String#equals equals}(code)</code>
207         * returns {@code true}. If no existing instance is found, then a new one is created for
208         * the given name.
209         *
210         * @param code The name of the code to fetch or to create.
211         * @return A code matching the given name.
212         */
213        public static MediumName valueOf(String code) {
214            return valueOf(MediumName.class, code);
215        }
216    }