thredds.wcs.v1_1_0.GetCapabilities Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of netcdf Show documentation
Show all versions of netcdf Show documentation
The NetCDF-Java Library is a Java interface to NetCDF files,
as well as to many other types of scientific data formats.
/*
* Copyright 1998-2009 University Corporation for Atmospheric Research/Unidata
*
* Portions of this software were developed by the Unidata Program at the
* University Corporation for Atmospheric Research.
*
* Access and use of this software shall impose the following obligations
* and understandings on the user. The user is granted the right, without
* any fee or cost, to use, copy, modify, alter, enhance and distribute
* this software, and any derivative works thereof, and its supporting
* documentation for any purpose whatsoever, provided that this entire
* notice appears in all copies of the software, derivative works and
* supporting documentation. Further, UCAR requests that the user credit
* UCAR/Unidata in any publications that result from the use of this
* software or in any product that includes this software. The names UCAR
* and/or Unidata, however, may not be used in any advertising or publicity
* to endorse or promote any products or commercial entity unless specific
* written permission is obtained from UCAR/Unidata. The user also
* understands that UCAR/Unidata is not obligated to provide the user with
* any support, consulting, training or assistance of any kind with regard
* to the use, operation and performance of this software nor to provide
* the user with any updates, revisions, new versions or "bug fixes."
*
* THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL,
* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE.
*/
package thredds.wcs.v1_1_0;
import ucar.nc2.dt.GridDataset;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.net.URI;
import java.io.PrintWriter;
import java.io.IOException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
import org.jdom.output.XMLOutputter;
import org.jdom.output.Format;
/**
* _more_
*
* @author edavis
* @since 4.0
*/
public class GetCapabilities
{
private org.slf4j.Logger logger =
org.slf4j.LoggerFactory.getLogger( GetCapabilities.class );
protected static final Namespace wcsNS = Namespace.getNamespace( "http://www.opengis.net/wcs/1.1" );
protected static final Namespace owcsNS = Namespace.getNamespace( "owcs", "http://www.opengis.net/wcs/1.1/ows" );
protected static final Namespace owsNS = Namespace.getNamespace( "ows", "http://www.opengis.net/ows" );
protected static final Namespace xlinkNS = Namespace.getNamespace( "xlink", "http://www.w3.org/1999/xlink" );
public enum Section
{
ServiceIdentification, ServiceProvider,
OperationsMetadata, Contents, All
}
private URI serverURI;
private List sections;
private String version = "1.1.0";
private ServiceId serviceId;
private ServiceProvider serviceProvider;
private GridDataset dataset;
private Document capabilitiesReport;
public GetCapabilities( URI serverURI, List sections,
ServiceId serviceId, ServiceProvider serviceProvider,
GridDataset dataset )
{
this.serverURI = serverURI;
this.sections = sections;
this.serviceId = serviceId;
this.serviceProvider = serviceProvider;
this.dataset = dataset;
if ( this.serverURI == null )
throw new IllegalArgumentException( "Non-null server URI required.");
if ( this.sections == null )
throw new IllegalArgumentException( "Non-null sections list required (may be empty).");
if ( this.dataset == null )
throw new IllegalArgumentException( "Non-null dataset required.");
}
public Document getCapabilitiesReport()
{
if ( this.capabilitiesReport == null )
capabilitiesReport = generateCapabilities();
return capabilitiesReport;
}
public void writeCapabilitiesReport( PrintWriter pw )
throws IOException
{
XMLOutputter xmlOutputter = new XMLOutputter( Format.getPrettyFormat() );
xmlOutputter.output( getCapabilitiesReport(), pw );
}
public Document generateCapabilities()
{
Element capabilitiesElem = new Element( "Capabilities", wcsNS );
capabilitiesElem.addNamespaceDeclaration( owcsNS );
capabilitiesElem.addNamespaceDeclaration( owsNS );
capabilitiesElem.addNamespaceDeclaration( xlinkNS );
capabilitiesElem.setAttribute( "version", this.version); // ToDo
//capabilitiesElem.setAttribute( "updateSequence", ""); // ToDo
boolean allSections = false;
if ( sections == null || sections.size() == 0 ||
( sections.size() == 1 && sections.get( 0 ).equals( Section.All ) ) )
{
allSections = true;
}
if ( allSections || sections.contains( Section.ServiceIdentification))
{
capabilitiesElem.addContent( generateServiceIdentification( serviceId ));
}
if ( allSections || sections.contains( Section.ServiceProvider))
{
capabilitiesElem.addContent( generateServiceProvider( serviceProvider) );
}
if ( allSections || sections.contains( Section.OperationsMetadata ))
{
capabilitiesElem.addContent( generateOperationsMetadata());
}
if ( allSections || sections.contains( Section.Contents))
{
capabilitiesElem.addContent( generateContents());
}
return new Document( capabilitiesElem );
}
public Element generateServiceIdentification( ServiceId serviceId )
{
Element serviceIdElem = new Element( "ServiceIdentification", owcsNS );
if ( serviceId != null )
{
if ( serviceId.getTitle() != null )
{
Element titleElem = new Element( "Title", owsNS );
titleElem.addContent( serviceId.getTitle() );
serviceIdElem.addContent( titleElem );
}
if ( serviceId.getAbstract() != null )
{
Element abstractElem = new Element( "Abstract", owsNS );
abstractElem.addContent( serviceId.getAbstract() );
serviceIdElem.addContent( abstractElem );
}
if ( serviceId.getKeywords() != null &&
serviceId.getKeywords().size() > 0 )
{
Element keywordsElem = new Element( "Keywords", owsNS );
for ( String curKey : serviceId.getKeywords() )
{
Element keywordElem = new Element( "Keyword", owsNS );
keywordElem.addContent( curKey );
keywordsElem.addContent( keywordElem );
}
serviceIdElem.addContent( keywordsElem );
}
if ( serviceId.getServiceType() != null )
{
Element serviceTypeElem = new Element( "ServiceType", owcsNS );
serviceTypeElem.addContent( serviceId.getServiceType() );
serviceIdElem.addContent( serviceTypeElem );
}
if ( serviceId.getServiceTypeVersion() != null &&
serviceId.getServiceTypeVersion().size() > 0 )
{
for ( String curVer : serviceId.getServiceTypeVersion() )
{
Element serviceTypeVersionElem = new Element( "ServiceTypeVersion", owcsNS );
serviceTypeVersionElem.addContent( curVer );
serviceIdElem.addContent( serviceTypeVersionElem );
}
}
// ToDo When would this be needed? What are Application Profiles? GML profiles?
// List appProfileIds;
// for ( URI curAppProfileId : appProfileIds)
// {
// serviceIdElem.addContent( new Element( "Profile", owcsNS).addContent( curAppProfileId.toString()));
// }
// 1) WCS spec says that encoding format application profile spec has title of the form:
// "WCS 1.1 Application Profile for [Format] [formatVersion] encoding, [profileVersion]"
// [[Here's the CF-NetCDF title:
// "WCS 1.1 Application Profile for CF-netCDF (1.0-3.0) Coverage Encoding, 1.0" (OGC 06-082r1)]]
// but it doesn't say anything about a URI for such an Application Profile.
// 2) Whereas, the WCS Capabilities doc has a place to identify supported App Profiles by using a URI.
if ( serviceId.getFees() != null )
{
Element feesElem = new Element( "Fees", owcsNS );
feesElem.addContent( serviceId.getFees() );
serviceIdElem.addContent( feesElem );
}
if ( serviceId.getAccessConstraints() != null &&
serviceId.getAccessConstraints().size() > 0 )
{
for ( String curAC : serviceId.getAccessConstraints() )
{
Element accessConstraintsElem = new Element( "AccessConstraints", owcsNS );
accessConstraintsElem.addContent( curAC );
serviceIdElem.addContent( accessConstraintsElem );
}
}
}
return serviceIdElem;
}
public Element generateServiceProvider( ServiceProvider serviceProvider )
{
// ServiceProvider (ows) [0..1]
Element servProvElem = new Element( "ServiceProvider", owsNS );
if ( serviceProvider != null )
{
if ( serviceProvider.name != null )
{
// ServiceProvider/ProviderName (ows) [0..1]
servProvElem.addContent(
new Element( "ProviderName", owsNS ).addContent(
serviceProvider.name ) );
}
if ( serviceProvider.site != null )
{
// ServiceProvider/ProviderSite (ows) [0..1]
Element provSiteElem = new Element( "ProviderSite", owsNS );
provSiteElem.setAttribute( "type", "simple" );
if ( serviceProvider.site.title != null)
provSiteElem.setAttribute( "title", serviceProvider.site.title, xlinkNS );
if ( serviceProvider.site.link != null )
provSiteElem.setAttribute( "href", serviceProvider.site.link.toString(), xlinkNS );
servProvElem.addContent( provSiteElem );
}
if ( serviceProvider.contact != null )
{
// ServiceProvider/ServiceContact (ows) [0..1]
Element servContactElem = new Element( "ServiceContact", owsNS );
if ( serviceProvider.contact.individualName != null )
{
// ServiceProvider/ServiceContact/IndividualName (ows) [0..1]
Element individualNameElem = new Element( "IndividualName", owsNS);
individualNameElem.addContent( serviceProvider.contact.individualName);
servContactElem.addContent( individualNameElem);
}
if ( serviceProvider.contact.positionName != null )
{
// ServiceProvider/ServiceContact/PositionName (ows) [0..1]
Element positionNameElem = new Element( "PositionName", owsNS);
positionNameElem.addContent( serviceProvider.contact.positionName );
servContactElem.addContent( positionNameElem );
}
if ( serviceProvider.contact.contactInfo != null )
{
// ServiceProvider/ServiceContact/ContactInfo (ows)[0..1]
Element contactInfoElem = new Element( "ContactInfo", owsNS);
if ( serviceProvider.contact.contactInfo.voicePhone != null ||
serviceProvider.contact.contactInfo.faxPhone != null )
{
// ServiceProvider/ServiceContact/ContactInfo/Phone (ows)[0..1]
Element phoneElem = new Element( "Phone", owsNS);
if ( serviceProvider.contact.contactInfo.voicePhone != null )
for (String curPhone : serviceProvider.contact.contactInfo.voicePhone)
// ServiceProvider/ServiceContact/ContactInfo/Phone/Voice (ows)[0..*]
phoneElem.addContent( new Element( "Voice", owsNS ).addContent( curPhone ));
if ( serviceProvider.contact.contactInfo.faxPhone != null )
for (String curPhone : serviceProvider.contact.contactInfo.faxPhone)
// ServiceProvider/ServiceContact/ContactInfo/Phone/Facsimile (ows)[0..*]
phoneElem.addContent( new Element( "Facsimile", owsNS ).addContent( curPhone ));
contactInfoElem.addContent( phoneElem);
}
if ( serviceProvider.contact.contactInfo.address != null )
{
// ServiceProvider/ServiceContact/ContactInfo/Address (ows) [0..1]
Element addressElem = new Element( "Address", owsNS);
if ( serviceProvider.contact.contactInfo.address.deliveryPoint != null )
{
for ( String curDP : serviceProvider.contact.contactInfo.address.deliveryPoint)
{
// ServiceProvider/ServiceContact/ContactInfo/Address/DeliveryPoint (ows) [0..*]
addressElem.addContent( new Element( "DeliveryPoint", owsNS).addContent( curDP));
}
}
if ( serviceProvider.contact.contactInfo.address.city != null )
{
// ServiceProvider/ServiceContact/ContactInfo/Address/City (ows) [0..1]
addressElem.addContent( new Element( "City", owsNS)
.addContent( serviceProvider.contact.contactInfo.address.city));
}
if ( serviceProvider.contact.contactInfo.address.adminArea != null )
{
// ServiceProvider/ServiceContact/ContactInfo/Address/AdministrativeArea (ows) [0..1]
addressElem.addContent( new Element( "AdministrativeArea", owsNS )
.addContent( serviceProvider.contact.contactInfo.address.adminArea ) );
}
if ( serviceProvider.contact.contactInfo.address.postalCode != null )
{
// ServiceProvider/ServiceContact/ContactInfo/Address/PostalCode (ows) [0..1]
addressElem.addContent( new Element( "PostalCode", owsNS )
.addContent( serviceProvider.contact.contactInfo.address.postalCode ) );
}
if ( serviceProvider.contact.contactInfo.address.country != null)
{
// ServiceProvider/ServiceContact/ContactInfo/Address/Country (ows) [0..1]
addressElem.addContent( new Element( "Country", owsNS )
.addContent( serviceProvider.contact.contactInfo.address.country ) );
}
if ( serviceProvider.contact.contactInfo.address.email != null )
{
for ( String curEmail : serviceProvider.contact.contactInfo.address.email )
{
// ServiceProvider/ServiceContact/ContactInfo/Address/ElectronicMailAddress (ows) [0..*]
addressElem.addContent( new Element( "ElectronicMailAddress", owsNS )
.addContent( curEmail ) );
}
}
contactInfoElem.addContent( addressElem);
}
if ( serviceProvider.contact.contactInfo.onlineResource != null )
{
// ServiceProvider/ServiceContact/ContactInfo/OnlineResource (ows) [0..1]
Element onlineResourceElem = new Element( "OnlineResource", owsNS);
onlineResourceElem.setAttribute( "type", "simple");
if ( serviceProvider.contact.contactInfo.onlineResource.title != null )
onlineResourceElem.setAttribute( "title", serviceProvider.contact.contactInfo.onlineResource.title, xlinkNS );
if ( serviceProvider.contact.contactInfo.onlineResource.link != null )
onlineResourceElem.setAttribute( "href", serviceProvider.contact.contactInfo.onlineResource.link.toString(), xlinkNS );
contactInfoElem.addContent( onlineResourceElem);
}
if ( serviceProvider.contact.contactInfo.hoursOfService != null )
// ServiceProvider/ServiceContact/ContactInfo/HoursOfService (ows) [0..1]
contactInfoElem.addContent( new Element( "HoursOfService", owsNS)
.addContent( serviceProvider.contact.contactInfo.hoursOfService));
if ( serviceProvider.contact.contactInfo.contactInstructions != null )
// ServiceProvider/ServiceContact/ContactInfo/ContactInstructions (ows) [0..1]
contactInfoElem.addContent( new Element( "ContactInstructions", owsNS )
.addContent( serviceProvider.contact.contactInfo.contactInstructions ) );
servContactElem.addContent( contactInfoElem);
}
if ( serviceProvider.contact.role != null )
{
// ServiceProvider/ServiceContact/Role (ows) [0..1]
servContactElem.addContent( new Element( "Role", owsNS )
.addContent( serviceProvider.contact.role));
}
servProvElem.addContent( servContactElem );
}
}
return servProvElem;
}
public Element generateOperationsMetadata()
{
// OperationsMetadata (owcs) [0..1]
Element opsMetadataElem = new Element( "OperationsMetadata", owcsNS );
// OperationsMetadata/Operation (owcs) [2..*]
// OperationsMetadata/Operation@name - i.e., "GetCapabilities" or "DescribeCoverage" or "GetCoverage"
// OperationsMetadata/Operation/...
opsMetadataElem.addContent( genGetCapOpsElement());
opsMetadataElem.addContent( genDescCovOpsElement());
opsMetadataElem.addContent( genGetCovOpsElement());
// OperationsMetadata/Parameter (owcs) [0..*]
// OperationsMetadata/Parameter/..(?) (owcs) [0..*]
// OperationsMetadata/Constraint (owcs) [0..*]
// OperationsMetadata/Constraint/.. (owcs) [0..*]
// OperationsMetadata/ExtendedCapabilities (owcs) [0..1]
// OperationsMetadata/ExtendedCapabilities/.. (owcs) [0..1]
//
return opsMetadataElem;
}
private Element genGetCapOpsElement()
{
// OperationsMetadata/Operation (owcs) @name="GetCapabilities"
Element getCapOpsElem = new Element( "Operation", owcsNS );
getCapOpsElem.setAttribute( "name", Request.Operation.GetCapabilities.toString() );
// Add DCP/HTTP/GET element with xlink to this server.
// OperationsMetadata/Operation/DCP/HTTP/{GET|POST} (owcs) [1..*]
// - @type=simple, @xlink:title, @xlink:href
getCapOpsElem.addContent(
new Element( "DCP", owcsNS ).addContent(
new Element( "HTTP", owcsNS ).addContent(
new Element( "GET", owcsNS ).setAttribute(
"href", serverURI.toString(), xlinkNS ) ) ) );
// Add the "Service", "AcceptVersions", and "Sections" parameters.
// OperationsMetadata/Operation/Parameter (owcs) [0..*]
getCapOpsElem.addContent( genParamElement( "service", Collections.singletonList( "WCS" ) ) );
List allowedValList = new ArrayList();
allowedValList.add( "1.1.0" );
allowedValList.add( "1.0.0" );
getCapOpsElem.addContent( genParamElement( "AcceptVersions", allowedValList ) );
List sectList = new ArrayList();
sectList.add( "ServiceIdentification" );
sectList.add( "ServiceProvider" );
sectList.add( "OperationsMetadata" );
sectList.add( "Content" );
sectList.add( "All" );
getCapOpsElem.addContent( genParamElement( "Sections", sectList ) );
// No constraints or metadata for this operation.
// OperationsMetadata/Operation/Constraint (owcs) [0..*]
// OperationsMetadata/Operation/Metadata (ows) [0..*]
return getCapOpsElem;
}
private Element genDescCovOpsElement()
{
// OperationsMetadata/Operation (owcs) @name="DescribeCoverage"
Element descCovOpsElem = new Element( "Operation", owcsNS );
descCovOpsElem.setAttribute( "name", Request.Operation.DescribeCoverage.toString() );
// Add DCP/HTTP/GET element with xlink to this server.
// OperationsMetadata/Operation/DCP/HTTP/{GET|POST} (owcs) [1..*]
// - @type=simple, @xlink:title, @xlink:href
descCovOpsElem.addContent(
new Element( "DCP", owcsNS ).addContent(
new Element( "HTTP", owcsNS ).addContent(
new Element( "GET", owcsNS ).setAttribute(
"href", serverURI.toString(), xlinkNS ) ) ) );
// Add the "Service", "Version", "AcceptVersions", and "Sections" parameters.
// OperationsMetadata/Operation/Parameter (owcs) [0..*]
descCovOpsElem.addContent( genParamElement( "service", Collections.singletonList( "WCS" ) ) );
descCovOpsElem.addContent( genParamElement( "version", Collections.singletonList( "1.1.0" ) ) );
List idList = new ArrayList();
for ( GridDataset.Gridset gs : this.dataset.getGridsets() )
{
idList.add( gs.getGeoCoordSystem().getName());
}
descCovOpsElem.addContent( genParamElement( "Identifier", idList ) );
// No constraints or metadata for this operation.
// OperationsMetadata/Operation/Constraint (owcs) [0..*]
// OperationsMetadata/Operation/Metadata (ows) [0..*]
return descCovOpsElem;
}
private Element genGetCovOpsElement()
{
// OperationsMetadata/Operation (owcs) @name="GetCoverage"
Element getCovOpsElem = new Element( "Operation", owcsNS );
getCovOpsElem.setAttribute( "name", Request.Operation.GetCoverage.toString() );
// Add DCP/HTTP/GET element with xlink to this server.
// OperationsMetadata/Operation/DCP/HTTP/{GET|POST} (owcs) [1..*]
// - @type=simple, @xlink:title, @xlink:href
getCovOpsElem.addContent(
new Element( "DCP", owcsNS ).addContent(
new Element( "HTTP", owcsNS ).addContent(
new Element( "GET", owcsNS ).setAttribute(
"href", serverURI.toString(), xlinkNS ) ) ) );
// Add the "Service", "Version", "AcceptVersions", and "Sections" parameters.
// OperationsMetadata/Operation/Parameter (owcs) [0..*]
getCovOpsElem.addContent( genParamElement( "service", Collections.singletonList( "WCS" ) ) );
getCovOpsElem.addContent( genParamElement( "version", Collections.singletonList( "1.1.0" ) ) );
getCovOpsElem.addContent( genParamElement( "store", Collections.singletonList( "False" ) ) );
List idList = new ArrayList();
for ( GridDataset.Gridset gs : this.dataset.getGridsets() )
{
idList.add( gs.getGeoCoordSystem().getName() );
}
getCovOpsElem.addContent( genParamElement( "Identifier", idList ) );
// No constraints or metadata for this operation.
// OperationsMetadata/Operation/Constraint (owcs) [0..*]
// OperationsMetadata/Operation/Metadata (ows) [0..*]
return getCovOpsElem;
}
private Element genParamElement( String name, List allowedValues )
{
Element paramElem = new Element( "Parameter", owcsNS ).setAttribute( "name", name );
Element allowedValuesElem = new Element( "AllowedValues", owcsNS );
for ( String curVal : allowedValues )
allowedValuesElem.addContent( new Element( "Value", owcsNS).addContent( curVal ) );
return paramElem.addContent( allowedValuesElem);
}
public Element generateContents()
{
// Contents (wcs) [0..1]
Element contentElem = new Element( "Contents", wcsNS );
for ( GridDataset.Gridset gs : this.dataset.getGridsets())
{
// Contents/CoverageSummary (wcs) [0..1]
// [[NOTE(1): use unless info can be found in Contents/OtherSources.]]
Element curCovSum = new Element( "CoverageSummary", wcsNS);
// Contents/CoverageSummary/Title (ows) [0..1]
curCovSum.addContent( new Element( "Title", owsNS).addContent( gs.getGeoCoordSystem().getName()));
// Contents/CoverageSummary/Abstract (ows) [0..1]
// Contents/CoverageSummary/Keywords (ows) [0..*]
// Contents/CoverageSummary/Metadata/... (ows) [0..*]
// [[NOTE: Either xlink simple type or a concrete AbstractMetaData element.]]
// [[NOTE: We are going to support xlink simple type only but probably the TDS won't use this element.]]
// Contents/CoverageSummary/WGS84BoundingBox/... (ows) [0..*]
// Contents/CoverageSummary/SupportedCRS (ows) [0..*] - URI
// Contents/CoverageSummary/SupportedFormats (ows) [0..*] - MIME type
curCovSum.addContent( new Element( "SupportedFormats", owsNS).addContent("application/x-netcdf"));
// ----
// [[NOTE: This coverage must contain lowerl-level coverages and/or an identifier.]]
// Contents/CoverageSummary/CoverageSummary/... (wcs) [1..*]
// [[NOTE: Indicates that the parent coverage contains lower-level coverages.]]
// Contents/CoverageSummary/Identifier (wcs) [0..1]
// [[NOTE: Indicates that this coverage can be accessed directly by GetCoverage and DescribeCoverage.]]
// [[NOTE: this ID must be unique to this WCS server.]]
curCovSum.addContent( new Element( "Identifier", wcsNS).addContent( gs.getGeoCoordSystem().getName()));
// ----
contentElem.addContent( curCovSum);
}
// Contents/SupportedCRS (wcs) [0..*] - URI
// [[NOTE: union of all SupportedCRS from nested CoverageSummary-s]]
// Contents/SupportedFormat (wcs) [0..*] - MIME type
// [[NOTE: union of all SupportedFormat from nested CoverageSummary-s]]
// Contents/OtherSource (wcs) [0..*] - @type=simple, @xlink:title, @xlink:href
// [[NOTE(1): unless info can be found in sibling CoverageSummary elements.]]
return contentElem;
}
/**
* Contain the content needed for a GetCapabilities ServiceIdentification section.
*/
public static class ServiceId
{
private String title, _abstract;
private List keywords;
private String serviceType;
private List serviceTypeVersion;
private String fees;
private List accessConstraints;
public ServiceId( String title, String anAbstract, List keywords, String serviceType, List serviceTypeVersion, String fees, List accessConstraints )
{
this.title = title;
this._abstract = anAbstract;
this.keywords = new ArrayList( keywords);
this.serviceType = serviceType;
this.serviceTypeVersion = new ArrayList( serviceTypeVersion );
this.fees = fees;
this.accessConstraints = new ArrayList( accessConstraints );
}
public String getTitle() { return title; }
public String getAbstract() { return _abstract; }
public List getKeywords() { return Collections.unmodifiableList( keywords); }
public String getServiceType() { return serviceType; }
public List getServiceTypeVersion() { return Collections.unmodifiableList( serviceTypeVersion); }
public String getFees() { return fees; }
public List getAccessConstraints() { return Collections.unmodifiableList( accessConstraints); }
}
/**
* Contain content needed for a GetCapabilities ServiceProvider section.
*/
public static class ServiceProvider
{
public ServiceProvider( String name, OnlineResource site, ServiceContact contact )
{
this.name = name;
this.site = site;
this.contact = contact;
}
public String getName(){ return name; }
private String name;
public OnlineResource getSite() { return site; }
private OnlineResource site;
public ServiceContact getContact() { return contact; }
private ServiceContact contact;
public static class OnlineResource
{
public OnlineResource( URI link, String title )
{
this.link = link;
this.title = title;
}
public URI getLink() { return link; }
private URI link;
public String getTitle() { return title; }
private String title;
}
public static class ServiceContact
{
public ServiceContact( String individualName, String positionName, ContactInfo contactInfo, String role )
{
this.individualName = individualName;
this.positionName = positionName;
this.contactInfo = contactInfo;
this.role = role;
}
public String getIndividualName() { return individualName; }
private String individualName;
public String getPositionName() { return positionName; }
private String positionName;
public ContactInfo getContactInfo() { return contactInfo; }
private ContactInfo contactInfo;
public String getRole() { return role; }
private String role;
}
public static class ContactInfo
{
public ContactInfo( List voicePhone, List faxPhone, Address address, OnlineResource onlineResource, String hoursOfService, String contactInstructions )
{
this.voicePhone = new ArrayList( voicePhone);
this.faxPhone = new ArrayList( faxPhone);
this.address = address;
this.onlineResource = onlineResource;
this.hoursOfService = hoursOfService;
this.contactInstructions = contactInstructions;
}
public List getVoicePhone() { return Collections.unmodifiableList( voicePhone); }
private List voicePhone;
public List getFaxPhone() { return Collections.unmodifiableList( faxPhone); }
private List faxPhone;
public Address getAddress() { return address; }
private Address address;
public OnlineResource getOnlineResource() { return onlineResource; }
private OnlineResource onlineResource;
public String getHoursOfService() { return hoursOfService; }
private String hoursOfService;
public String getContactInstructions() { return contactInstructions; }
private String contactInstructions;
}
public static class Address
{
public Address( List deliveryPoint, String city, String adminArea, String postalCode, String country, List email )
{
this.deliveryPoint = new ArrayList( deliveryPoint);
this.city = city;
this.adminArea = adminArea;
this.postalCode = postalCode;
this.country = country;
this.email = new ArrayList( email);
}
public List getDeliveryPoint() { return Collections.unmodifiableList( deliveryPoint); }
private List deliveryPoint;
public String getCity() { return city; }
private String city;
public String getAdminArea() { return adminArea; }
private String adminArea;
public String getPostalCode() { return postalCode; }
private String postalCode;
public String getCountry() { return country; }
private String country;
public List getEmail() { return Collections.unmodifiableList( email); }
private List email;
}
}
}