/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2004-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* This package contains documentation from OpenGIS specifications.
* OpenGIS consortium's work is fully acknowledged here.
*/
package org.geotools.metadata.iso.citation;
import java.util.Collection;
import java.util.Date;
import org.opengis.metadata.Identifier;
import org.opengis.metadata.citation.Citation;
import org.opengis.metadata.citation.CitationDate;
import org.opengis.metadata.citation.PresentationForm;
import org.opengis.metadata.citation.ResponsibleParty;
import org.opengis.metadata.citation.Series;
import org.opengis.util.InternationalString;
import org.geotools.metadata.iso.MetadataEntity;
import org.geotools.metadata.iso.IdentifierImpl;
import org.geotools.util.SimpleInternationalString;
/**
* Standardized resource reference.
*
* @since 2.1
* @source $URL$
* @version $Id$
* @author Martin Desruisseaux (IRD)
* @author Jody Garnett
*/
public class CitationImpl extends MetadataEntity implements Citation {
/**
* Serial number for interoperability with different versions.
*/
private static final long serialVersionUID = -4415559967618358778L;
/**
* Name by which the cited resource is known.
*/
private InternationalString title;
/**
* Short name or other language name by which the cited information is known.
* Example: "DCW" as an alternative title for "Digital Chart of the World.
*/
private Collection<InternationalString> alternateTitles;
/**
* Reference date for the cited resource.
*/
private Collection<CitationDate> dates;
/**
* Version of the cited resource.
*/
private InternationalString edition;
/**
* Date of the edition in millisecondes ellapsed sine January 1st, 1970,
* or {@link Long#MIN_VALUE} if none.
*/
private long editionDate = Long.MIN_VALUE;
/**
* Unique identifier for the resource. Example: Universal Product Code (UPC),
* National Stock Number (NSN).
*/
private Collection<Identifier> identifiers;
/**
* Name and position information for an individual or organization that is responsible
* for the resource. Returns an empty string if there is none.
*/
private Collection<ResponsibleParty> citedResponsibleParties;
/**
* Mode in which the resource is represented, or an empty string if none.
*/
private Collection<PresentationForm> presentationForm;
/**
* Information about the series, or aggregate dataset, of which the dataset is a part.
* May be {@code null} if none.
*/
private Series series;
/**
* Other information required to complete the citation that is not recorded elsewhere.
* May be {@code null} if none.
*/
private InternationalString otherCitationDetails;
/**
* Common title with holdings note. Note: title identifies elements of a series
* collectively, combined with information about what volumes are available at the
* source cited. May be {@code null} if there is no title.
*/
private InternationalString collectiveTitle;
/**
* International Standard Book Number, or {@code null} if none.
*/
private String ISBN;
/**
* International Standard Serial Number, or {@code null} if none.
*/
private String ISSN;
/**
* Constructs an initially empty citation.
*/
public CitationImpl() {
}
/**
* Constructs a new citation initialized to the values specified by the given object.
* This constructor performs a shallow copy (i.e. each source attributes are reused
* without copying them).
*/
public CitationImpl(final Citation source) {
super(source);
}
/**
* Constructs a citation with the specified title.
*
* @param title The title, as a {@link String} or an {@link InternationalString} object.
*/
public CitationImpl(final CharSequence title) {
final InternationalString t;
if (title instanceof InternationalString) {
t = (InternationalString) title;
} else {
t = new SimpleInternationalString(title.toString());
}
setTitle(t);
}
/**
* Constructs a citation with the specified responsible party. This convenience constructor
* initialize the citation title to the first non-null of the following properties:
* {@linkplain ResponsibleParty#getOrganisationName organisation name},
* {@linkplain ResponsibleParty#getPositionName position name} or
* {@linkplain ResponsibleParty#getIndividualName individual name}.
*
* @since 2.2
*/
public CitationImpl(final ResponsibleParty party) {
InternationalString title = party.getOrganisationName();
if (title == null) {
title = party.getPositionName();
if (title == null) {
String name = party.getIndividualName();
if (name != null) {
title = new SimpleInternationalString(name);
}
}
}
setTitle(title);
getCitedResponsibleParties().add(party);
}
/**
* Adds the specified identifier as a CRS authority factory. This is used as a convenience
* method for the creation of constants, and for making sure that all of them use the same
* identifier type.
*/
final void addAuthority(final String identifier, final boolean asTitle) {
if (asTitle) {
getAlternateTitles().add(new SimpleInternationalString(identifier));
}
getIdentifiers().add(new IdentifierImpl(identifier));
}
/**
* Returns the name by which the cited resource is known.
*/
public InternationalString getTitle() {
return title;
}
/**
* Set the name by which the cited resource is known.
*/
public synchronized void setTitle(final InternationalString newValue) {
checkWritePermission();
title = newValue;
}
/**
* Returns the short name or other language name by which the cited information is known.
* Example: "DCW" as an alternative title for "Digital Chart of the World".
*/
public synchronized Collection<InternationalString> getAlternateTitles() {
return (alternateTitles = nonNullCollection(alternateTitles, InternationalString.class));
}
/**
* Set the short name or other language name by which the cited information is known.
*/
public synchronized void setAlternateTitles(
final Collection<? extends InternationalString> newValues)
{
alternateTitles = copyCollection(newValues, alternateTitles, InternationalString.class);
}
/**
* Returns the reference date for the cited resource.
*/
public synchronized Collection<CitationDate> getDates() {
return dates = nonNullCollection(dates, CitationDate.class);
}
/**
* Set the reference date for the cited resource.
*/
public synchronized void setDates(final Collection<? extends CitationDate> newValues) {
dates = copyCollection(newValues, dates, CitationDate.class);
}
/**
* Returns the version of the cited resource.
*/
public InternationalString getEdition() {
return edition;
}
/**
* Set the version of the cited resource.
*/
public synchronized void setEdition(final InternationalString newValue) {
checkWritePermission();
edition = newValue;
}
/**
* Returns the date of the edition, or {@code null} if none.
*/
public synchronized Date getEditionDate() {
return (editionDate!=Long.MIN_VALUE) ? new Date(editionDate) : null;
}
/**
* Set the date of the edition, or {@code null} if none.
*
* @todo Use an unmodifiable {@link Date} here.
*/
public synchronized void setEditionDate(final Date newValue) {
checkWritePermission();
editionDate = (newValue!=null) ? newValue.getTime() : Long.MIN_VALUE;
}
/**
* Returns the unique identifier for the resource. Example: Universal Product Code (UPC),
* National Stock Number (NSN).
*/
public synchronized Collection<Identifier> getIdentifiers() {
return (identifiers = nonNullCollection(identifiers, Identifier.class));
}
/**
* Set the unique identifier for the resource. Example: Universal Product Code (UPC),
* National Stock Number (NSN).
*/
public synchronized void setIdentifiers(final Collection<? extends Identifier> newValues) {
identifiers = copyCollection(newValues, identifiers, Identifier.class);
}
/**
* Returns the name and position information for an individual or organization that is
* responsible for the resource. Returns an empty string if there is none.
*/
public synchronized Collection<ResponsibleParty> getCitedResponsibleParties() {
return (citedResponsibleParties = nonNullCollection(citedResponsibleParties,
ResponsibleParty.class));
}
/**
* Set the name and position information for an individual or organization that is responsible
* for the resource. Returns an empty string if there is none.
*/
public synchronized void setCitedResponsibleParties(
final Collection<? extends ResponsibleParty> newValues)
{
citedResponsibleParties = copyCollection(newValues, citedResponsibleParties,
ResponsibleParty.class);
}
/**
* Returns the mode in which the resource is represented, or an empty string if none.
*/
public synchronized Collection<PresentationForm> getPresentationForm() {
return (presentationForm = nonNullCollection(presentationForm,
PresentationForm.class));
}
/**
* Set the mode in which the resource is represented, or an empty string if none.
*/
public synchronized void setPresentationForm(
final Collection<? extends PresentationForm> newValues)
{
presentationForm = copyCollection(newValues, presentationForm, PresentationForm.class);
}
/**
* Returns the information about the series, or aggregate dataset, of which the dataset is
* a part. Returns {@code null} if none.
*/
public Series getSeries() {
return series;
}
/**
* Set the information about the series, or aggregate dataset, of which the dataset is
* a part. Set to {@code null} if none.
*/
public synchronized void setSeries(final Series newValue) {
checkWritePermission();
series = newValue;
}
/**
* Returns other information required to complete the citation that is not recorded elsewhere.
* Returns {@code null} if none.
*/
public InternationalString getOtherCitationDetails() {
return otherCitationDetails;
}
/**
* Set other information required to complete the citation that is not recorded elsewhere.
* Set to {@code null} if none.
*/
public synchronized void setOtherCitationDetails(final InternationalString newValue) {
checkWritePermission();
otherCitationDetails = newValue;
}
/**
* Returns the common title with holdings note. Note: title identifies elements of a series
* collectively, combined with information about what volumes are available at the
* source cited. Returns {@code null} if there is no title.
*/
public InternationalString getCollectiveTitle() {
return collectiveTitle;
}
/**
* Set the common title with holdings note. Note: title identifies elements of a series
* collectively, combined with information about what volumes are available at the
* source cited. Set to {@code null} if there is no title.
*/
public synchronized void setCollectiveTitle(final InternationalString newValue) {
checkWritePermission();
collectiveTitle = newValue;
}
/**
* Returns the International Standard Book Number, or {@code null} if none.
*/
public String getISBN() {
return ISBN;
}
/**
* Set the International Standard Book Number, or {@code null} if none.
*/
public synchronized void setISBN(final String newValue) {
checkWritePermission();
ISBN = newValue;
}
/**
* Returns the International Standard Serial Number, or {@code null} if none.
*/
public String getISSN() {
return ISSN;
}
/**
* Set the International Standard Serial Number, or {@code null} if none.
*/
public synchronized void setISSN(final String newValue) {
checkWritePermission();
ISSN = newValue;
}
}