| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.sis.metadata.iso.identification; |
| |
| import java.util.Collection; |
| import javax.xml.bind.annotation.XmlType; |
| import javax.xml.bind.annotation.XmlSeeAlso; |
| import javax.xml.bind.annotation.XmlElement; |
| import javax.xml.bind.annotation.XmlRootElement; |
| import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; |
| import org.opengis.metadata.Identifier; |
| import org.opengis.metadata.citation.Citation; |
| import org.opengis.metadata.citation.ResponsibleParty; |
| import org.opengis.metadata.constraint.Constraints; |
| import org.opengis.metadata.distribution.Format; |
| import org.opengis.metadata.extent.Extent; |
| import org.opengis.metadata.identification.AggregateInformation; |
| import org.opengis.metadata.identification.AssociatedResource; |
| import org.opengis.metadata.identification.Identification; |
| import org.opengis.metadata.identification.DataIdentification; |
| import org.opengis.metadata.identification.BrowseGraphic; |
| import org.opengis.metadata.identification.Keywords; |
| import org.opengis.metadata.identification.Progress; |
| import org.opengis.metadata.identification.Resolution; |
| import org.opengis.metadata.identification.TopicCategory; |
| import org.opengis.metadata.identification.Usage; |
| import org.opengis.metadata.identification.ServiceIdentification; |
| import org.opengis.metadata.maintenance.MaintenanceInformation; |
| import org.opengis.metadata.spatial.SpatialRepresentationType; |
| import org.opengis.temporal.Duration; |
| import org.opengis.util.InternationalString; |
| import org.apache.sis.internal.metadata.Dependencies; |
| import org.apache.sis.internal.metadata.legacy.LegacyPropertyAdapter; |
| import org.apache.sis.internal.jaxb.metadata.MD_Identifier; |
| import org.apache.sis.internal.jaxb.FilterByVersion; |
| import org.apache.sis.internal.xml.LegacyNamespaces; |
| import org.apache.sis.metadata.iso.ISOMetadata; |
| import org.apache.sis.util.iso.Types; |
| |
| |
| /** |
| * Basic information required to uniquely identify a resource or resources. |
| * The following properties are mandatory or conditional (i.e. mandatory under some circumstances) |
| * in a well-formed metadata according ISO 19115: |
| * |
| * <div class="preformat">{@code MD_Identification} |
| * {@code ├─citation………………………………………} Citation data for the resource(s). |
| * {@code │ ├─title……………………………………} Name by which the cited resource is known. |
| * {@code │ └─date………………………………………} Reference date for the cited resource. |
| * {@code ├─abstract………………………………………} Brief narrative summary of the content of the resource(s). |
| * {@code ├─extent……………………………………………} Bounding polygon, vertical, and temporal extent of the dataset. |
| * {@code │ ├─description……………………} The spatial and temporal extent for the referring object. |
| * {@code │ ├─geographicElement……} Geographic component of the extent of the referring object. |
| * {@code │ ├─temporalElement…………} Temporal component of the extent of the referring object. |
| * {@code │ └─verticalElement…………} Vertical component of the extent of the referring object. |
| * {@code └─topicCategory…………………………} Main theme(s) of the dataset.</div> |
| * |
| * <p><b>Limitations:</b></p> |
| * <ul> |
| * <li>Instances of this class are not synchronized for multi-threading. |
| * Synchronization, if needed, is caller's responsibility.</li> |
| * <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases. |
| * Serialization support is appropriate for short term storage or RMI between applications running the |
| * same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li> |
| * </ul> |
| * |
| * @author Martin Desruisseaux (IRD, Geomatys) |
| * @author Touraïvane (IRD) |
| * @author Cédric Briançon (Geomatys) |
| * @author Cullen Rombach (Image Matters) |
| * @version 1.0 |
| * @since 0.3 |
| * @module |
| */ |
| @XmlType(name = "AbstractMD_Identification_Type", propOrder = { |
| "citation", |
| "abstract", |
| "purpose", |
| "credits", |
| "status", |
| "pointOfContacts", |
| "spatialRepresentationTypes", // Here in ISO 19115:2014 (was after 'aggregationInfo' in ISO 19115:2003) |
| "spatialResolutions", // Shall be kept next to 'spatialRepresentationTypes' |
| "temporalResolution", // ISO 19115-3 only |
| "topicCategories", // Here in ISO 19115:2014 (was in subclasses in ISO 19115:2003) |
| "extents", // Here in ISO 19115:2014 (was in subclasses in ISO 19115:2003) |
| "additionalDocumentation", // ISO 19115:2014 only |
| "processingLevel", // ISO 19115:2014 only |
| "resourceMaintenances", |
| "graphicOverviews", |
| "resourceFormats", |
| "descriptiveKeywords", |
| "resourceSpecificUsages", |
| "resourceConstraints", |
| "associatedResource", |
| "aggregationInfo", // Legacy ISO 19115:2003 (replaced by 'associatedResources') |
| /* |
| * NOTE: legacy ISO 19115:2003 specification had 'spatialRepresentationTypes' and 'spatialResolutions' |
| * elements last. If we wanted to produce strictly compliant legacy XML documents, we would have |
| * to duplicate those attributes. We avoid this complexity on the assumption that readers are |
| * tolerant to different order (this relaxation is needed only for legacy XML). |
| */ |
| }) |
| @XmlRootElement(name = "AbstractMD_Identification") |
| @XmlSeeAlso({ |
| DefaultDataIdentification.class, |
| DefaultServiceIdentification.class |
| }) |
| public class AbstractIdentification extends ISOMetadata implements Identification { |
| /** |
| * Serial number for compatibility with different versions. |
| */ |
| private static final long serialVersionUID = -1132210324047663554L; |
| |
| /** |
| * Citation for the resource(s). |
| */ |
| private Citation citation; |
| |
| /** |
| * Brief narrative summary of the resource(s). |
| */ |
| private InternationalString abstracts; |
| |
| /** |
| * Summary of the intentions with which the resource(s) was developed. |
| */ |
| private InternationalString purpose; |
| |
| /** |
| * Recognition of those who contributed to the resource(s). |
| */ |
| private Collection<String> credits; |
| |
| /** |
| * Status of the resource(s). |
| */ |
| private Collection<Progress> status; |
| |
| /** |
| * Identification of, and means of communication with, person(s) and organizations(s) |
| * associated with the resource(s). |
| */ |
| private Collection<ResponsibleParty> pointOfContacts; |
| |
| /** |
| * Methods used to spatially represent geographic information. |
| */ |
| private Collection<SpatialRepresentationType> spatialRepresentationTypes; |
| |
| /** |
| * Factor which provides a general understanding of the density of spatial data in the resource(s). |
| */ |
| private Collection<Resolution> spatialResolutions; |
| |
| /** |
| * Smallest resolvable temporal period in a resource. |
| */ |
| private Collection<Duration> temporalResolutions; |
| |
| /** |
| * Main theme(s) of the resource. |
| */ |
| private Collection<TopicCategory> topicCategories; |
| |
| /** |
| * Spatial and temporal extent of the resource. |
| */ |
| private Collection<Extent> extents; |
| |
| /** |
| * Other documentation associated with the resource. |
| */ |
| private Collection<Citation> additionalDocumentations; |
| |
| /** |
| * Code that identifies the level of processing in the producers coding system of a resource. |
| */ |
| private Identifier processingLevel; |
| |
| /** |
| * Provides information about the frequency of resource updates, and the scope of those updates. |
| */ |
| private Collection<MaintenanceInformation> resourceMaintenances; |
| |
| /** |
| * Provides a graphic that illustrates the resource(s) (should include a legend for the graphic). |
| */ |
| private Collection<BrowseGraphic> graphicOverviews; |
| |
| /** |
| * Provides a description of the format of the resource(s). |
| */ |
| private Collection<Format> resourceFormats; |
| |
| /** |
| * Provides category keywords, their type, and reference source. |
| */ |
| private Collection<Keywords> descriptiveKeywords; |
| |
| /** |
| * Provides basic information about specific application(s) for which the resource(s) |
| * has/have been or is being used by different users. |
| */ |
| private Collection<Usage> resourceSpecificUsages; |
| |
| /** |
| * Provides information about constraints which apply to the resource(s). |
| */ |
| private Collection<Constraints> resourceConstraints; |
| |
| /** |
| * Provides aggregate dataset information. |
| */ |
| private Collection<AssociatedResource> associatedResources; |
| |
| /** |
| * Constructs an initially empty identification. |
| */ |
| public AbstractIdentification() { |
| } |
| |
| /** |
| * Creates an identification initialized to the specified values. |
| * |
| * @param citation the citation data for the resource(s), or {@code null} if none. |
| * @param abstracts a brief narrative summary of the content of the resource(s), or {@code null} if none. |
| */ |
| public AbstractIdentification(final Citation citation, final CharSequence abstracts) { |
| this.citation = citation; |
| this.abstracts = Types.toInternationalString(abstracts); |
| } |
| |
| /** |
| * Constructs a new instance initialized with the values from the specified metadata object. |
| * This is a <cite>shallow</cite> copy constructor, since the other metadata contained in the |
| * given object are not recursively copied. |
| * |
| * @param object the metadata to copy values from, or {@code null} if none. |
| * |
| * @see #castOrCopy(Identification) |
| */ |
| public AbstractIdentification(final Identification object) { |
| super(object); |
| if (object != null) { |
| citation = object.getCitation(); |
| abstracts = object.getAbstract(); |
| purpose = object.getPurpose(); |
| credits = copyCollection(object.getCredits(), String.class); |
| status = copyCollection(object.getStatus(), Progress.class); |
| pointOfContacts = copyCollection(object.getPointOfContacts(), ResponsibleParty.class); |
| spatialRepresentationTypes = copyCollection(object.getSpatialRepresentationTypes(), SpatialRepresentationType.class); |
| spatialResolutions = copyCollection(object.getSpatialResolutions(), Resolution.class); |
| temporalResolutions = copyCollection(object.getTemporalResolutions(), Duration.class); |
| topicCategories = copyCollection(object.getTopicCategories(), TopicCategory.class); |
| extents = copyCollection(object.getExtents(), Extent.class); |
| additionalDocumentations = copyCollection(object.getAdditionalDocumentations(), Citation.class); |
| processingLevel = object.getProcessingLevel(); |
| resourceMaintenances = copyCollection(object.getResourceMaintenances(), MaintenanceInformation.class); |
| graphicOverviews = copyCollection(object.getGraphicOverviews(), BrowseGraphic.class); |
| resourceFormats = copyCollection(object.getResourceFormats(), Format.class); |
| descriptiveKeywords = copyCollection(object.getDescriptiveKeywords(), Keywords.class); |
| resourceSpecificUsages = copyCollection(object.getResourceSpecificUsages(), Usage.class); |
| resourceConstraints = copyCollection(object.getResourceConstraints(), Constraints.class); |
| associatedResources = copyCollection(object.getAssociatedResources(), AssociatedResource.class); |
| } |
| } |
| |
| /** |
| * Returns a SIS metadata implementation with the values of the given arbitrary implementation. |
| * This method performs the first applicable action in the following choices: |
| * |
| * <ul> |
| * <li>If the given object is {@code null}, then this method returns {@code null}.</li> |
| * <li>Otherwise if the given object is an instance of {@link DataIdentification} or |
| * {@link ServiceIdentification}, then this method delegates to the {@code castOrCopy(…)} |
| * method of the corresponding SIS subclass. Note that if the given object implements |
| * more than one of the above-cited interfaces, then the {@code castOrCopy(…)} method |
| * to be used is unspecified.</li> |
| * <li>Otherwise if the given object is already an instance of |
| * {@code AbstractIdentification}, then it is returned unchanged.</li> |
| * <li>Otherwise a new {@code AbstractIdentification} instance is created using the |
| * {@linkplain #AbstractIdentification(Identification) copy constructor} |
| * and returned. Note that this is a <cite>shallow</cite> copy operation, since the other |
| * metadata contained in the given object are not recursively copied.</li> |
| * </ul> |
| * |
| * @param object the object to get as a SIS implementation, or {@code null} if none. |
| * @return a SIS implementation containing the values of the given object (may be the |
| * given object itself), or {@code null} if the argument was null. |
| */ |
| public static AbstractIdentification castOrCopy(final Identification object) { |
| if (object instanceof DataIdentification) { |
| return DefaultDataIdentification.castOrCopy((DataIdentification) object); |
| } |
| if (object instanceof ServiceIdentification) { |
| return DefaultServiceIdentification.castOrCopy((ServiceIdentification) object); |
| } |
| // Intentionally tested after the sub-interfaces. |
| if (object == null || object instanceof AbstractIdentification) { |
| return (AbstractIdentification) object; |
| } |
| return new AbstractIdentification(object); |
| } |
| |
| /** |
| * Returns the citation for the resource(s). |
| * |
| * @return citation for the resource(s). |
| */ |
| @Override |
| @XmlElement(name = "citation", required = true) |
| public Citation getCitation() { |
| return citation; |
| } |
| |
| /** |
| * Sets the citation for the resource(s). |
| * |
| * @param newValue the new citation. |
| */ |
| public void setCitation(final Citation newValue) { |
| checkWritePermission(citation); |
| citation = newValue; |
| } |
| |
| /** |
| * Returns a brief narrative summary of the resource(s). |
| * |
| * @return brief narrative summary of the resource(s). |
| */ |
| @Override |
| @XmlElement(name = "abstract", required = true) |
| public InternationalString getAbstract() { |
| return abstracts; |
| } |
| |
| /** |
| * Sets a brief narrative summary of the resource(s). |
| * |
| * @param newValue the new summary of resource(s). |
| */ |
| public void setAbstract(final InternationalString newValue) { |
| checkWritePermission(abstracts); |
| abstracts = newValue; |
| } |
| |
| /** |
| * Returns a summary of the intentions with which the resource(s) was developed. |
| * |
| * @return the intentions with which the resource(s) was developed, or {@code null}. |
| */ |
| @Override |
| @XmlElement(name = "purpose") |
| public InternationalString getPurpose() { |
| return purpose; |
| } |
| |
| /** |
| * Sets a summary of the intentions with which the resource(s) was developed. |
| * |
| * @param newValue the new summary of intention. |
| */ |
| public void setPurpose(final InternationalString newValue) { |
| checkWritePermission(purpose); |
| purpose = newValue; |
| } |
| |
| /** |
| * Returns the recognition of those who contributed to the resource(s). |
| * |
| * <div class="warning"><b>Upcoming API change — generalization</b><br> |
| * The element type may be changed to the {@code InternationalString} interface in GeoAPI 4.0. |
| * </div> |
| * |
| * @return recognition of those who contributed to the resource(s). |
| */ |
| @Override |
| @XmlElement(name = "credit") |
| public Collection<String> getCredits() { |
| return credits = nonNullCollection(credits, String.class); |
| } |
| |
| /** |
| * Sets the recognition of those who contributed to the resource(s). |
| * |
| * <div class="warning"><b>Upcoming API change — generalization</b><br> |
| * The element type may be changed to the {@code InternationalString} interface in GeoAPI 4.0. |
| * </div> |
| * |
| * @param newValues the new credits. |
| */ |
| public void setCredits(final Collection<? extends String> newValues) { |
| credits = writeCollection(newValues, credits, String.class); |
| } |
| |
| /** |
| * Returns the status of the resource(s). |
| * |
| * @return status of the resource(s), or {@code null}. |
| */ |
| @Override |
| @XmlElement(name = "status") |
| public Collection<Progress> getStatus() { |
| return status = nonNullCollection(status, Progress.class); |
| } |
| |
| /** |
| * Sets the status of the resource(s). |
| * |
| * @param newValues the new status. |
| */ |
| public void setStatus(final Collection<? extends Progress> newValues) { |
| status = writeCollection(newValues, status, Progress.class); |
| } |
| |
| /** |
| * Returns the identification of, and means of communication with, person(s) and organizations(s) |
| * associated with the resource(s). |
| * |
| * <div class="warning"><b>Upcoming API change — generalization</b><br> |
| * As of ISO 19115:2014, {@code ResponsibleParty} is replaced by the {@code Responsibility} parent interface. |
| * This change may be applied in GeoAPI 4.0. |
| * </div> |
| * |
| * @return means of communication with person(s) and organizations(s) associated with the resource(s). |
| * |
| * @see org.apache.sis.metadata.iso.DefaultMetadata#getContacts() |
| */ |
| @Override |
| @XmlElement(name = "pointOfContact") |
| public Collection<ResponsibleParty> getPointOfContacts() { |
| return pointOfContacts = nonNullCollection(pointOfContacts, ResponsibleParty.class); |
| } |
| |
| /** |
| * Sets the means of communication with persons(s) and organizations(s) associated with the resource(s). |
| * |
| * <div class="warning"><b>Upcoming API change — generalization</b><br> |
| * As of ISO 19115:2014, {@code ResponsibleParty} is replaced by the {@code Responsibility} parent interface. |
| * This change may be applied in GeoAPI 4.0. |
| * </div> |
| * |
| * @param newValues the new points of contacts. |
| */ |
| public void setPointOfContacts(final Collection<? extends ResponsibleParty> newValues) { |
| pointOfContacts = writeCollection(newValues, pointOfContacts, ResponsibleParty.class); |
| } |
| |
| /** |
| * Returns the methods used to spatially represent geographic information. |
| * |
| * @return methods used to spatially represent geographic information. |
| * |
| * @since 0.5 |
| */ |
| @Override |
| @XmlElement(name = "spatialRepresentationType") |
| public Collection<SpatialRepresentationType> getSpatialRepresentationTypes() { |
| return spatialRepresentationTypes = nonNullCollection(spatialRepresentationTypes, SpatialRepresentationType.class); |
| } |
| |
| /** |
| * Sets the method used to spatially represent geographic information. |
| * |
| * @param newValues the new spatial representation types. |
| * |
| * @since 0.5 |
| */ |
| public void setSpatialRepresentationTypes(final Collection<? extends SpatialRepresentationType> newValues) { |
| spatialRepresentationTypes = writeCollection(newValues, spatialRepresentationTypes, SpatialRepresentationType.class); |
| } |
| |
| /** |
| * Returns the factor which provides a general understanding of the density of spatial data in the resource(s). |
| * This element should be repeated when describing upper and lower range. |
| * |
| * @return factor which provides a general understanding of the density of spatial data. |
| * |
| * @since 0.5 |
| */ |
| @Override |
| @XmlElement(name = "spatialResolution") |
| public Collection<Resolution> getSpatialResolutions() { |
| return spatialResolutions = nonNullCollection(spatialResolutions, Resolution.class); |
| } |
| |
| /** |
| * Sets the factor which provides a general understanding of the density of spatial data in the resource(s). |
| * |
| * @param newValues the new spatial resolutions. |
| * |
| * @since 0.5 |
| */ |
| public void setSpatialResolutions(final Collection<? extends Resolution> newValues) { |
| spatialResolutions = writeCollection(newValues, spatialResolutions, Resolution.class); |
| } |
| |
| /** |
| * Returns the smallest resolvable temporal period in a resource. |
| * |
| * @return smallest resolvable temporal period in a resource. |
| * |
| * @since 0.5 |
| */ |
| @Override |
| // @XmlElement at the end of this class. |
| public Collection<Duration> getTemporalResolutions() { |
| return temporalResolutions = nonNullCollection(temporalResolutions, Duration.class); |
| } |
| |
| /** |
| * Sets the smallest resolvable temporal period in a resource. |
| * |
| * @param newValues the new temporal resolutions. |
| * |
| * @since 0.5 |
| */ |
| public void setTemporalResolutions(final Collection<? extends Duration> newValues) { |
| temporalResolutions = writeCollection(newValues, temporalResolutions, Duration.class); |
| } |
| |
| /** |
| * Returns the main theme(s) of the resource. |
| * |
| * @return main theme(s). |
| * |
| * @since 0.5 |
| */ |
| @Override |
| @XmlElement(name = "topicCategory") |
| public Collection<TopicCategory> getTopicCategories() { |
| return topicCategories = nonNullCollection(topicCategories, TopicCategory.class); |
| } |
| |
| /** |
| * Sets the main theme(s) of the resource. |
| * |
| * @param newValues the new topic categories. |
| * |
| * @since 0.5 |
| */ |
| public void setTopicCategories(final Collection<? extends TopicCategory> newValues) { |
| topicCategories = writeCollection(newValues, topicCategories, TopicCategory.class); |
| } |
| |
| /** |
| * Returns the spatial and temporal extent of the resource. |
| * |
| * @return spatial and temporal extent of the resource. |
| * |
| * @since 0.5 |
| */ |
| @Override |
| @XmlElement(name = "extent") |
| public Collection<Extent> getExtents() { |
| return extents = nonNullCollection(extents, Extent.class); |
| } |
| |
| /** |
| * Sets the spatial and temporal extent of the resource. |
| * |
| * @param newValues the new extents |
| * |
| * @since 0.5 |
| */ |
| public void setExtents(final Collection<? extends Extent> newValues) { |
| extents = writeCollection(newValues, extents, Extent.class); |
| } |
| |
| /** |
| * Returns other documentation associated with the resource. |
| * |
| * @return other documentation associated with the resource. |
| * |
| * @since 0.5 |
| */ |
| @Override |
| // @XmlElement at the end of this class. |
| public Collection<Citation> getAdditionalDocumentations() { |
| return additionalDocumentations = nonNullCollection(additionalDocumentations, Citation.class); |
| } |
| |
| /** |
| * Sets other documentation associated with the resource. |
| * |
| * @param newValues the documentation to associate with the resource. |
| * |
| * @since 0.5 |
| */ |
| public void setAdditionalDocumentations(final Collection<? extends Citation> newValues) { |
| additionalDocumentations = writeCollection(newValues, additionalDocumentations, Citation.class); |
| } |
| |
| /** |
| * Returns code(s) that identifies the level of processing in the producers coding system of a resource. |
| * |
| * @return code(s) that identifies the level of processing in the producers coding system of a resource. |
| * |
| * @since 0.5 |
| */ |
| @Override |
| @XmlElement(name = "processingLevel") |
| @XmlJavaTypeAdapter(MD_Identifier.Since2014.class) |
| public Identifier getProcessingLevel() { |
| return processingLevel; |
| } |
| |
| /** |
| * Sets code that identifies the level of processing in the producers coding system of a resource. |
| * |
| * @param newValue New code that identifies the level of processing. |
| * |
| * @since 0.5 |
| */ |
| public void setProcessingLevel(final Identifier newValue) { |
| checkWritePermission(processingLevel); |
| processingLevel = newValue; |
| } |
| |
| /** |
| * Provides information about the frequency of resource updates, and the scope of those updates. |
| * |
| * @return frequency and scope of resource updates. |
| */ |
| @Override |
| @XmlElement(name = "resourceMaintenance") |
| public Collection<MaintenanceInformation> getResourceMaintenances() { |
| return resourceMaintenances = nonNullCollection(resourceMaintenances, MaintenanceInformation.class); |
| } |
| |
| /** |
| * Sets information about the frequency of resource updates, and the scope of those updates. |
| * |
| * @param newValues the new resource maintenance info. |
| */ |
| public void setResourceMaintenances(final Collection<? extends MaintenanceInformation> newValues) { |
| resourceMaintenances = writeCollection(newValues, resourceMaintenances, MaintenanceInformation.class); |
| } |
| |
| /** |
| * Provides a graphic that illustrates the resource(s) (should include a legend for the graphic). |
| * |
| * @return a graphic that illustrates the resource(s). |
| */ |
| @Override |
| @XmlElement(name = "graphicOverview") |
| public Collection<BrowseGraphic> getGraphicOverviews() { |
| return graphicOverviews = nonNullCollection(graphicOverviews, BrowseGraphic.class); |
| } |
| |
| /** |
| * Sets a graphic that illustrates the resource(s). |
| * |
| * @param newValues the new graphics overviews. |
| */ |
| public void setGraphicOverviews(final Collection<? extends BrowseGraphic> newValues) { |
| graphicOverviews = writeCollection(newValues, graphicOverviews, BrowseGraphic.class); |
| } |
| |
| /** |
| * Provides a description of the format of the resource(s). |
| * |
| * @return description of the format. |
| * |
| * @see org.apache.sis.metadata.iso.distribution.DefaultDistribution#getDistributionFormats() |
| */ |
| @Override |
| @XmlElement(name = "resourceFormat") |
| public Collection<Format> getResourceFormats() { |
| return resourceFormats = nonNullCollection(resourceFormats, Format.class); |
| } |
| |
| /** |
| * Sets a description of the format of the resource(s). |
| * |
| * @param newValues the new resource format. |
| * |
| * @see org.apache.sis.metadata.iso.distribution.DefaultDistribution#setDistributionFormats(Collection) |
| */ |
| public void setResourceFormats(final Collection<? extends Format> newValues) { |
| resourceFormats = writeCollection(newValues, resourceFormats, Format.class); |
| } |
| |
| /** |
| * Provides category keywords, their type, and reference source. |
| * |
| * @return category keywords, their type, and reference source. |
| */ |
| @Override |
| @XmlElement(name = "descriptiveKeywords") |
| public Collection<Keywords> getDescriptiveKeywords() { |
| return descriptiveKeywords = nonNullCollection(descriptiveKeywords, Keywords.class); |
| } |
| |
| /** |
| * Sets category keywords, their type, and reference source. |
| * |
| * @param newValues the new descriptive keywords. |
| */ |
| public void setDescriptiveKeywords(final Collection<? extends Keywords> newValues) { |
| descriptiveKeywords = writeCollection(newValues, descriptiveKeywords, Keywords.class); |
| } |
| |
| /** |
| * Provides basic information about specific application(s) for which the resource(s) |
| * has/have been or is being used by different users. |
| * |
| * @return information about specific application(s) for which the resource(s) |
| * has/have been or is being used. |
| */ |
| @Override |
| @XmlElement(name = "resourceSpecificUsage") |
| public Collection<Usage> getResourceSpecificUsages() { |
| return resourceSpecificUsages = nonNullCollection(resourceSpecificUsages, Usage.class); |
| } |
| |
| /** |
| * Sets basic information about specific application(s). |
| * |
| * @param newValues the new resource specific usages. |
| */ |
| public void setResourceSpecificUsages(final Collection<? extends Usage> newValues) { |
| resourceSpecificUsages = writeCollection(newValues, resourceSpecificUsages, Usage.class); |
| } |
| |
| /** |
| * Provides information about constraints which apply to the resource(s). |
| * |
| * @return constraints which apply to the resource(s). |
| */ |
| @Override |
| @XmlElement(name = "resourceConstraints") |
| public Collection<Constraints> getResourceConstraints() { |
| return resourceConstraints = nonNullCollection(resourceConstraints, Constraints.class); |
| } |
| |
| /** |
| * Sets information about constraints which apply to the resource(s). |
| * |
| * @param newValues the new resource constraints. |
| */ |
| public void setResourceConstraints(final Collection<? extends Constraints> newValues) { |
| resourceConstraints = writeCollection(newValues, resourceConstraints, Constraints.class); |
| } |
| |
| /** |
| * Provides associated resource information. |
| * |
| * @return associated resource information. |
| * |
| * @since 0.5 |
| */ |
| @Override |
| // @XmlElement at the end of this class. |
| public Collection<AssociatedResource> getAssociatedResources() { |
| return associatedResources = nonNullCollection(associatedResources, AssociatedResource.class); |
| } |
| |
| /** |
| * Sets associated resource information. |
| * |
| * @param newValues the new associated resources. |
| * |
| * @since 0.5 |
| */ |
| public void setAssociatedResources(final Collection<? extends AssociatedResource> newValues) { |
| associatedResources = writeCollection(newValues, associatedResources, AssociatedResource.class); |
| } |
| |
| /** |
| * Provides aggregate dataset information. |
| * |
| * @return aggregate dataset information. |
| * |
| * @deprecated As of ISO 19115:2014, replaced by {@link #getAssociatedResources()}. |
| */ |
| @Override |
| @Deprecated |
| @Dependencies("getAssociatedResources") |
| @XmlElement(name = "aggregationInfo", namespace = LegacyNamespaces.GMD) |
| public Collection<AggregateInformation> getAggregationInfo() { |
| if (!FilterByVersion.LEGACY_METADATA.accept()) return null; |
| return new LegacyPropertyAdapter<AggregateInformation,AssociatedResource>(getAssociatedResources()) { |
| @Override protected AssociatedResource wrap(final AggregateInformation value) { |
| return value; |
| } |
| |
| @Override protected AggregateInformation unwrap(final AssociatedResource container) { |
| return DefaultAggregateInformation.castOrCopy(container); |
| } |
| |
| @Override protected boolean update(final AssociatedResource container, final AggregateInformation value) { |
| return container == value; |
| } |
| }.validOrNull(); |
| } |
| |
| /** |
| * Sets aggregate dataset information. |
| * |
| * @param newValues the new aggregation info. |
| * |
| * @deprecated As of ISO 19115:2014, replaced by {@link #setAssociatedResources(Collection)}. |
| */ |
| @Deprecated |
| public void setAggregationInfo(final Collection<? extends AggregateInformation> newValues) { |
| setAssociatedResources(newValues); |
| } |
| |
| |
| |
| |
| ////////////////////////////////////////////////////////////////////////////////////////////////// |
| //////// //////// |
| //////// XML support with JAXB //////// |
| //////// //////// |
| //////// The following methods are invoked by JAXB using reflection (even if //////// |
| //////// they are private) or are helpers for other methods invoked by JAXB. //////// |
| //////// Those methods can be safely removed if Geographic Markup Language //////// |
| //////// (GML) support is not needed. //////// |
| //////// //////// |
| ////////////////////////////////////////////////////////////////////////////////////////////////// |
| |
| /** |
| * Invoked by JAXB at both marshalling and unmarshalling time. |
| * This attribute has been added by ISO 19115:2014 standard. |
| * If (and only if) marshalling an older standard version, we omit this attribute. |
| * |
| * @todo Currently, the {@code XmlJavaTypeAdapter} used here just internally converts {@code Duration} objects |
| * into {@code PeriodDuration} objects. Need to add support for {@code IntervalLength} in the future. |
| */ |
| @XmlElement(name = "temporalResolution") |
| private Collection<Duration> getTemporalResolution() { |
| return FilterByVersion.CURRENT_METADATA.accept() ? getTemporalResolutions() : null; |
| } |
| |
| @XmlElement(name = "additionalDocumentation") |
| private Collection<Citation> getAdditionalDocumentation() { |
| return FilterByVersion.CURRENT_METADATA.accept() ? getAdditionalDocumentations() : null; |
| } |
| |
| @XmlElement(name = "associatedResource") |
| private Collection<AssociatedResource> getAssociatedResource() { |
| return FilterByVersion.CURRENT_METADATA.accept() ? getAssociatedResources() : null; |
| } |
| } |