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;
033    
034    import java.util.Collection;
035    import java.util.Date;
036    import java.util.Locale;
037    
038    import org.opengis.metadata.acquisition.AcquisitionInformation;
039    import org.opengis.metadata.quality.DataQuality;
040    import org.opengis.metadata.maintenance.ScopeCode;
041    import org.opengis.metadata.constraint.Constraints;
042    import org.opengis.metadata.distribution.Distribution;
043    import org.opengis.metadata.citation.ResponsibleParty;
044    import org.opengis.metadata.content.ContentInformation;
045    import org.opengis.metadata.spatial.SpatialRepresentation;
046    import org.opengis.metadata.identification.CharacterSet;
047    import org.opengis.metadata.identification.Identification;
048    import org.opengis.metadata.maintenance.MaintenanceInformation;
049    import org.opengis.referencing.ReferenceSystem;
050    import org.opengis.annotation.UML;
051    import org.opengis.annotation.Profile;
052    
053    import static org.opengis.annotation.Obligation.*;
054    import static org.opengis.annotation.Specification.*;
055    import static org.opengis.annotation.ComplianceLevel.*;
056    
057    
058    /**
059     * Root entity which defines metadata about a resource or resources.
060     *
061     * @author  Martin Desruisseaux (IRD)
062     * @author  Cory Horner (Refractions Research)
063     * @version 3.0
064     * @since   2.0
065     *
066     * @navassoc 1 - - CharacterSet
067     * @navassoc - - - ScopeCode
068     * @navassoc - - - ResponsibleParty
069     * @navassoc - - - SpatialRepresentation
070     * @navassoc - - - ReferenceSystem
071     * @navassoc - - - MetadataExtensionInformation
072     * @navassoc - - - Identification
073     * @navassoc - - - ContentInformation
074     * @navassoc 1 - - Distribution
075     * @navassoc - - - DataQuality
076     * @navassoc - - - PortrayalCatalogueReference
077     * @navassoc - - - Constraints
078     * @navassoc - - - ApplicationSchemaInformation
079     * @navassoc 1 - - MaintenanceInformation
080     * @navassoc - - - AcquisitionInformation
081     */
082    @UML(identifier="MD_Metadata", specification=ISO_19115)
083    public interface Metadata {
084        /**
085         * Unique identifier for this metadata file, or {@code null} if none.
086         *
087         * @return Unique identifier for this metadata file, or {@code null}.
088         */
089        @Profile(level=CORE)
090        @UML(identifier="fileIdentifier", obligation=OPTIONAL, specification=ISO_19115)
091        String getFileIdentifier();
092    
093        /**
094         * Language used for documenting metadata.
095         *
096         * @return Language used for documenting metadata, or {@code null}.
097         *
098         * @condition Not defined by encoding.
099         */
100        @Profile(level=CORE)
101        @UML(identifier="language", obligation=CONDITIONAL, specification=ISO_19115)
102        Locale getLanguage();
103    
104        /**
105         * Full name of the character coding standard used for the metadata set.
106         *
107         * @return character coding standard used for the metadata, or {@code null}.
108         *
109         * @condition Not used and not defined by encoding.
110         */
111        @Profile(level=CORE)
112        @UML(identifier="characterSet", obligation=CONDITIONAL, specification=ISO_19115)
113        CharacterSet getCharacterSet();
114    
115        /**
116         * File identifier of the metadata to which this metadata is a subset (child).
117         *
118         * @return Identifier of the metadata to which this metadata is a subset, or {@code null}.
119         *
120         * @condition {@linkplain #getHierarchyLevels() Hierarchy level} is not equal to
121         *            {@link ScopeCode#DATASET}.
122         */
123        @UML(identifier="parentIdentifier", obligation=CONDITIONAL, specification=ISO_19115)
124        String getParentIdentifier();
125    
126        /**
127         * Scope to which the metadata applies.
128         * Metadata for which no hierarchy is listed are interpreted to be
129         * "{@linkplain ScopeCode#DATASET dataset}" metadata by default.
130         *
131         * @return Scope to which the metadata applies.
132         *
133         * @condition Mandatory if the metadata is about a resource other than a dataset.
134         */
135        @UML(identifier="hierarchyLevel", obligation=CONDITIONAL, specification=ISO_19115)
136        Collection<ScopeCode> getHierarchyLevels();
137    
138        /**
139         * Name of the hierarchy levels for which the metadata is provided.
140         *
141         * @return Hierarchy levels for which the metadata is provided.
142         *
143         * @condition {@linkplain #getHierarchyLevels() Hierarchy level} is not equal to
144         *            {@link ScopeCode#DATASET}.
145         */
146        @UML(identifier="hierarchyLevelName", obligation=CONDITIONAL, specification=ISO_19115)
147        Collection<String> getHierarchyLevelNames();
148    
149        /**
150         * Parties responsible for the metadata information.
151         *
152         * @return Parties responsible for the metadata information.
153         *
154         * @see Identification#getPointOfContacts()
155         *
156         * @since 2.1
157         */
158        @Profile(level=CORE)
159        @UML(identifier="contact", obligation=MANDATORY, specification=ISO_19115)
160        Collection<? extends ResponsibleParty> getContacts();
161    
162        /**
163         * Date that the metadata was created.
164         * <p>
165         * <TABLE WIDTH="80%" ALIGN="center" CELLPADDING="18" BORDER="4" BGCOLOR="#FFE0B0">
166         *   <TR><TD>
167         *     <P align="justify"><B>Warning:</B> The return type of this method may change
168         *     in GeoAPI 3.1 release. It may be replaced by a type matching more closely
169         *     either ISO 19108 (<cite>Temporal Schema</cite>) or ISO 19103.</P>
170         *   </TD></TR>
171         * </TABLE>
172         *
173         * @return Date that the metadata was created.
174         */
175        @Profile(level=CORE)
176        @UML(identifier="dateStamp", obligation=MANDATORY, specification=ISO_19115)
177        Date getDateStamp();
178    
179        /**
180         * Name of the metadata standard (including profile name) used.
181         *
182         * @return Name of the metadata standard used, or {@code null}.
183         */
184        @Profile(level=CORE)
185        @UML(identifier="metadataStandardName", obligation=OPTIONAL, specification=ISO_19115)
186        String getMetadataStandardName();
187    
188        /**
189         * Version (profile) of the metadata standard used.
190         *
191         * @return Version of the metadata standard used, or {@code null}.
192         */
193        @Profile(level=CORE)
194        @UML(identifier="metadataStandardVersion", obligation=OPTIONAL, specification=ISO_19115)
195        String getMetadataStandardVersion();
196    
197        /**
198         * Uniformed Resource Identifier (URI) of the dataset to which the metadata applies.
199         *
200         * @return Uniformed Resource Identifier of the dataset, or {@code null}.
201         *
202         * @since 2.1
203         */
204        @UML(identifier="dataSetURI", obligation=OPTIONAL, specification=ISO_19115)
205        String getDataSetUri();
206    
207        /**
208         * Provides information about an alternatively used localized character
209         * string for a linguistic extension.
210         *
211         * @return Alternatively used localized character string for a linguistic extension.
212         *
213         * @since 2.1
214         */
215        @UML(identifier="locale", obligation=OPTIONAL, specification=ISO_19115)
216        Collection<Locale> getLocales();
217    
218        /**
219         * Digital representation of spatial information in the dataset.
220         *
221         * @return Digital representation of spatial information in the dataset.
222         */
223        @UML(identifier="spatialRepresentationInfo", obligation=OPTIONAL, specification=ISO_19115)
224        Collection<? extends SpatialRepresentation> getSpatialRepresentationInfo();
225    
226        /**
227         * Description of the spatial and temporal reference systems used in the dataset.
228         *
229         * @return Spatial and temporal reference systems used in the dataset.
230         */
231        @Profile(level=CORE)
232        @UML(identifier="referenceSystemInfo", obligation=OPTIONAL, specification=ISO_19115)
233        Collection<? extends ReferenceSystem> getReferenceSystemInfo();
234    
235        /**
236         * Information describing metadata extensions.
237         *
238         * @return Metadata extensions.
239         */
240        @UML(identifier="metadataExtensionInfo", obligation=OPTIONAL, specification=ISO_19115)
241        Collection<? extends MetadataExtensionInformation> getMetadataExtensionInfo();
242    
243        /**
244         * Basic information about the resource(s) to which the metadata applies.
245         *
246         * @return The resource(s) to which the metadata applies.
247         */
248        @Profile(level=CORE)
249        @UML(identifier="identificationInfo", obligation=MANDATORY, specification=ISO_19115)
250        Collection<? extends Identification> getIdentificationInfo();
251    
252        /**
253         * Provides information about the feature catalogue and describes the coverage and
254         * image data characteristics.
255         *
256         * @return The feature catalogue, coverage descriptions and image data characteristics.
257         */
258        @UML(identifier="contentInfo", obligation=OPTIONAL, specification=ISO_19115)
259        Collection<? extends ContentInformation> getContentInfo();
260    
261        /**
262         * Provides information about the distributor of and options for obtaining the resource(s).
263         *
264         * @return The distributor of and options for obtaining the resource(s).
265         */
266        @Profile(level=CORE)
267        @UML(identifier="distributionInfo", obligation=OPTIONAL, specification=ISO_19115)
268        Distribution getDistributionInfo();
269    
270        /**
271         * Provides overall assessment of quality of a resource(s).
272         *
273         * @return Overall assessment of quality of a resource(s).
274         */
275        @Profile(level=CORE)
276        @UML(identifier="dataQualityInfo", obligation=OPTIONAL, specification=ISO_19115)
277        Collection<? extends DataQuality> getDataQualityInfo();
278    
279        /**
280         * Provides information about the catalogue of rules defined for the portrayal of a resource(s).
281         *
282         * @return The catalogue of rules defined for the portrayal of a resource(s).
283         */
284        @UML(identifier="portrayalCatalogueInfo", obligation=OPTIONAL, specification=ISO_19115)
285        Collection<? extends PortrayalCatalogueReference> getPortrayalCatalogueInfo();
286    
287        /**
288         * Provides restrictions on the access and use of data.
289         *
290         * @return Restrictions on the access and use of data.
291         */
292        @UML(identifier="metadataConstraints", obligation=OPTIONAL, specification=ISO_19115)
293        Collection<? extends Constraints> getMetadataConstraints();
294    
295        /**
296         * Provides information about the conceptual schema of a dataset.
297         *
298         * @return The conceptual schema of a dataset.
299         */
300        @UML(identifier="applicationSchemaInfo", obligation=OPTIONAL, specification=ISO_19115)
301        Collection<? extends ApplicationSchemaInformation> getApplicationSchemaInfo();
302    
303        /**
304         * Provides information about the frequency of metadata updates, and the scope of those updates.
305         *
306         * @return The frequency of metadata updates and their scope.
307         */
308        @UML(identifier="metadataMaintenance", obligation=OPTIONAL, specification=ISO_19115)
309        MaintenanceInformation getMetadataMaintenance();
310    
311        /**
312         * Provides information about the acquisition of the data.
313         *
314         * @return The acquisition of data.
315         */
316        @UML(identifier="acquisitionInformation", obligation=OPTIONAL, specification=ISO_19115_2)
317        Collection<? extends AcquisitionInformation> getAcquisitionInformation();
318    }