52n-wps-server-gcube/src/main/java/org/n52/wps/server/request/CapabilitiesRequest.java

160 lines
5.6 KiB
Java
Raw Normal View History

/**
* Copyright (C) 2007 - 2016 52°North Initiative for Geospatial Open Source
* Software GmbH
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation.
*
* If the program is linked with libraries which are licensed under one of
* the following licenses, the combination of the program with the linked
* library is not considered a "derivative work" of the program:
*
* Apache License, version 2.0
* Apache Software License, version 1.0
* GNU Lesser General Public License, version 3
* Mozilla Public License, versions 1.0, 1.1 and 2.0
* Common Development and Distribution License (CDDL), version 1.0
*
* Therefore the distribution of the program linked with libraries licensed
* under the aforementioned licenses, is permitted by the copyright holders
* if the distribution is compliant with both the GNU General Public
* License version 2 and the aforementioned licenses.
*
* This program 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 General
* Public License for more details.
*/
package org.n52.wps.server.request;
import java.util.ArrayList;
import org.apache.commons.collections.map.CaseInsensitiveMap;
import org.n52.wps.server.ExceptionReport;
import org.n52.wps.server.handler.RequestHandler;
import org.n52.wps.server.response.CapabilitiesResponse;
import org.n52.wps.server.response.Response;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* Handles a CapabilitesRequest
*/
public class CapabilitiesRequest extends Request {
private static final String ACCEPT_VERSIONS_ELEMENT_NAME = "AcceptVersions";
private static final String PARAM_SERVICE = "service";
private static final String PARAM_VERSION = "version";
private static final Object REQUEST_DOC = "document";
/**
* Creates a CapabilitesRequest based on a Map (HTTP_GET)
*
* @param ciMap
* The client input
* @throws ExceptionReport
*/
public CapabilitiesRequest(CaseInsensitiveMap ciMap) throws ExceptionReport {
super(ciMap);
//Fix for https://bugzilla.52north.org/show_bug.cgi?id=907
String providedAcceptVersionsString = Request.getMapValue("acceptversions", ciMap, false);
if (providedAcceptVersionsString != null) {
String[] providedAcceptVersions = providedAcceptVersionsString.split(",");
if (providedAcceptVersions != null) {
map.put("version", providedAcceptVersions);
}
}
}
public CapabilitiesRequest(Document doc) throws ExceptionReport {
super(doc);
this.map = new CaseInsensitiveMap();
Node fc = this.doc.getFirstChild();
String name = fc.getNodeName();
this.map.put(REQUEST_DOC, name);
Node serviceItem = fc.getAttributes().getNamedItem("service");
if (serviceItem != null) {
String service = serviceItem.getNodeValue();
String[] serviceArray = {service};
this.map.put(PARAM_SERVICE, serviceArray);
}
NodeList nList = doc.getFirstChild().getChildNodes();
ArrayList<String> versionList = new ArrayList<String>();
for (int i = 0; i < nList.getLength(); i++) {
Node n = nList.item(i);
if (n.getLocalName() != null) {
if (n.getLocalName().equalsIgnoreCase(ACCEPT_VERSIONS_ELEMENT_NAME)) {
NodeList nList2 = n.getChildNodes();
for (int j = 0; j < nList2.getLength(); j++) {
Node n2 = nList2.item(j);
if (n2.getLocalName() != null
&& n2.getLocalName().equalsIgnoreCase(RequestHandler.VERSION_ATTRIBUTE_NAME)) {
versionList.add(n2.getTextContent());
}
}
break;
}
}
}
if ( !versionList.isEmpty()) {
this.map.put(PARAM_VERSION, versionList.toArray(new String[versionList.size()]));
}
}
/**
* Validates the client input
*
* @throws ExceptionReport
* @return True if the input is valid, False otherwise
*/
public boolean validate() throws ExceptionReport {
String services = getMapValue(PARAM_SERVICE, true);
if ( !services.equalsIgnoreCase("wps")) {
throw new ExceptionReport("Parameter <service> is not correct, expected: WPS , got: " + services,
ExceptionReport.INVALID_PARAMETER_VALUE, "service");
}
String[] versions = getMapArray(PARAM_VERSION, false);
if ( !requireVersion(SUPPORTED_VERSION, false)) {
throw new ExceptionReport("Requested versions are not supported, you requested: "
+ Request.accumulateString(versions), ExceptionReport.VERSION_NEGOTIATION_FAILED, "version");
}
return true;
}
/**
* Actually serves the Request.
*
* @throws ExceptionReport
* @return Response The result of the computation
*/
public Response call() throws ExceptionReport {
validate();
LOGGER.info("Handled GetCapabilitiesRequest successfully!");
return new CapabilitiesResponse(this);
}
/**
* Not used in this class. Returns null;
*/
public Object getAttachedResult() {
return null;
}
}