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.extent;
033    
034    import java.util.Collection;
035    import org.opengis.util.InternationalString;
036    import org.opengis.annotation.Profile;
037    import org.opengis.annotation.UML;
038    
039    import static org.opengis.annotation.Obligation.*;
040    import static org.opengis.annotation.Specification.*;
041    import static org.opengis.annotation.ComplianceLevel.*;
042    
043    
044    /**
045     * Information about spatial, vertical, and temporal extent.
046     * This interface has four optional attributes
047     * ({@linkplain #getGeographicElements geographic elements},
048     *  {@linkplain #getTemporalElements temporal elements}, and
049     *  {@linkplain #getVerticalElements vertical elements}) and an element called
050     *  {@linkplain #getDescription description}.
051     *  At least one of the four shall be used.
052     *
053     * @author  Martin Desruisseaux (IRD)
054     * @version 3.0
055     * @since   1.0
056     *
057     * @navassoc - - - GeographicExtent
058     * @navassoc - - - TemporalExtent
059     * @navassoc - - - VerticalExtent
060     */
061    @UML(identifier="EX_Extent", specification=ISO_19115)
062    public interface Extent {
063        /**
064         * Returns the spatial and temporal extent for the referring object.
065         *
066         * @return The spatial and temporal extent, or {@code null} in none.
067         *
068         * @condition {@linkplain #getGeographicElements Geographic element},
069         *            {@linkplain #getTemporalElements temporal element} and
070         *            {@linkplain #getVerticalElements vertical element} not documented.
071         */
072        @UML(identifier="description", obligation=CONDITIONAL, specification=ISO_19115)
073        InternationalString getDescription();
074    
075        /**
076         * Provides geographic component of the extent of the referring object.
077         *
078         * @return The geographic extent, or an empty set if none.
079         *
080         * @condition {@linkplain #getDescription Description},
081         *            {@linkplain #getTemporalElements temporal element} and
082         *            {@linkplain #getVerticalElements vertical element} not documented.
083         */
084        @Profile(level=CORE)
085        @UML(identifier="geographicElement", obligation=CONDITIONAL, specification=ISO_19115)
086        Collection<? extends GeographicExtent> getGeographicElements();
087    
088        /**
089         * Provides temporal component of the extent of the referring object.
090         *
091         * @return The temporal extent, or an empty set if none.
092         *
093         * @condition {@linkplain #getDescription Description},
094         *            {@linkplain #getGeographicElements geographic element} and
095         *            {@linkplain #getVerticalElements vertical element} not documented.
096         */
097        @Profile(level=CORE)
098        @UML(identifier="temporalElement", obligation=CONDITIONAL, specification=ISO_19115)
099        Collection<? extends TemporalExtent> getTemporalElements();
100    
101        /**
102         * Provides vertical component of the extent of the referring object.
103         *
104         * @return The vertical extent, or an empty set if none.
105         *
106         * @condition {@linkplain #getDescription Description},
107         *            {@linkplain #getGeographicElements geographic element} and
108         *            {@linkplain #getTemporalElements temporal element} not documented.
109         */
110        @Profile(level=CORE)
111        @UML(identifier="verticalElement", obligation=CONDITIONAL, specification=ISO_19115)
112        Collection<? extends VerticalExtent> getVerticalElements();
113    }