186 lines
6.2 KiB
Java
186 lines
6.2 KiB
Java
|
/**
|
|||
|
* 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.List;
|
|||
|
|
|||
|
import javax.xml.XMLConstants;
|
|||
|
import javax.xml.namespace.QName;
|
|||
|
|
|||
|
import net.opengis.wps.x100.ProcessDescriptionType;
|
|||
|
import net.opengis.wps.x100.ProcessDescriptionsDocument;
|
|||
|
|
|||
|
import org.apache.commons.collections.map.CaseInsensitiveMap;
|
|||
|
import org.apache.xmlbeans.XmlCursor;
|
|||
|
import org.n52.wps.server.ExceptionReport;
|
|||
|
import org.n52.wps.server.RepositoryManager;
|
|||
|
import org.n52.wps.server.WebProcessingService;
|
|||
|
import org.n52.wps.server.response.DescribeProcessResponse;
|
|||
|
import org.n52.wps.server.response.Response;
|
|||
|
import org.w3c.dom.Document;
|
|||
|
import org.w3c.dom.NamedNodeMap;
|
|||
|
import org.w3c.dom.Node;
|
|||
|
import org.w3c.dom.NodeList;
|
|||
|
|
|||
|
/**
|
|||
|
* Handles a DescribeProcessRequest
|
|||
|
* @see Request
|
|||
|
*/
|
|||
|
public class DescribeProcessRequest extends Request {
|
|||
|
|
|||
|
private ProcessDescriptionsDocument document;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a DescribeProcessRequest based on a Map (HTTP_GET)
|
|||
|
* @param ciMap The client input
|
|||
|
* @throws ExceptionReport
|
|||
|
*/
|
|||
|
public DescribeProcessRequest(CaseInsensitiveMap ciMap) throws ExceptionReport{
|
|||
|
super(ciMap);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a DescribeProcessRequest based on a Document (SOAP?)
|
|||
|
* @param doc The client input
|
|||
|
* @throws ExceptionReport
|
|||
|
*/
|
|||
|
public DescribeProcessRequest(Document doc) throws ExceptionReport{
|
|||
|
super(doc);
|
|||
|
|
|||
|
//put the respective elements of the document in the map
|
|||
|
NamedNodeMap nnm = doc.getFirstChild().getAttributes();
|
|||
|
|
|||
|
map = new CaseInsensitiveMap();
|
|||
|
|
|||
|
for (int i = 0; i < nnm.getLength(); i++) {
|
|||
|
|
|||
|
Node n = nnm.item(i);
|
|||
|
if(n.getLocalName().equalsIgnoreCase("service")){
|
|||
|
map.put(n.getLocalName(), new String[]{n.getNodeValue()});
|
|||
|
}else if(n.getLocalName().equalsIgnoreCase("version")){
|
|||
|
map.put(n.getLocalName(), new String[]{n.getNodeValue()});
|
|||
|
}
|
|||
|
}
|
|||
|
//get identifier
|
|||
|
String identifierList = "";
|
|||
|
|
|||
|
NodeList nList = doc.getFirstChild().getChildNodes();
|
|||
|
|
|||
|
boolean identifierParameterExists = false;
|
|||
|
|
|||
|
for (int i = 0; i < nList.getLength(); i++) {
|
|||
|
Node n = nList.item(i);
|
|||
|
if(n.getLocalName() != null && n.getLocalName().equalsIgnoreCase("identifier")){
|
|||
|
identifierParameterExists = true;
|
|||
|
String s = n.getTextContent();
|
|||
|
if(s != null && !s.isEmpty()){
|
|||
|
identifierList = identifierList.concat(s + ",");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if(identifierParameterExists){
|
|||
|
map.put("identifier", new String[]{identifierList});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* Validates the client input
|
|||
|
* @throws ExceptionReport
|
|||
|
* @return True if the input is valid, False otherwise
|
|||
|
*/
|
|||
|
public boolean validate() throws ExceptionReport{
|
|||
|
getMapValue("version", true, new String[]{"1.0.0"}); // required
|
|||
|
getMapValue("identifier", true); // required!
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public Object getAttachedResult(){
|
|||
|
return document;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Actually serves the Request.
|
|||
|
* @throws ExceptionReport
|
|||
|
* @return Response The result of the computation
|
|||
|
*/
|
|||
|
public Response call() throws ExceptionReport {
|
|||
|
validate();
|
|||
|
|
|||
|
document = ProcessDescriptionsDocument.Factory.newInstance();
|
|||
|
document.addNewProcessDescriptions();
|
|||
|
XmlCursor c = document.newCursor();
|
|||
|
c.toFirstChild();
|
|||
|
c.toLastAttribute();
|
|||
|
c.setAttributeText(new QName(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "schemaLocation"), "http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsDescribeProcess_response.xsd");
|
|||
|
|
|||
|
String[] identifiers = getMapValue("identifier", true).split(",");
|
|||
|
document.getProcessDescriptions().setLang(WebProcessingService.DEFAULT_LANGUAGE);
|
|||
|
document.getProcessDescriptions().setService("WPS");
|
|||
|
document.getProcessDescriptions().setVersion(Request.SUPPORTED_VERSION);
|
|||
|
|
|||
|
if(identifiers.length==1 && identifiers[0].equalsIgnoreCase("all")){
|
|||
|
List<String> identifierList = RepositoryManager.getInstance().getAlgorithms();
|
|||
|
identifiers = new String[identifierList.size()];
|
|||
|
for(int i = 0;i<identifierList.size();i++){
|
|||
|
identifiers[i] = identifierList.get(i);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// if(identifiers.length == 0){
|
|||
|
// throw new ExceptionReport("No process identifier specified for describe process operation.",
|
|||
|
// ExceptionReport.MISSING_PARAMETER_VALUE,
|
|||
|
// "parameter: identifier");
|
|||
|
// }else
|
|||
|
if(identifiers.length == 1){
|
|||
|
if(identifiers[0] == null || identifiers[0].isEmpty()){
|
|||
|
throw new ExceptionReport("Process description request with empty identifier.",
|
|||
|
ExceptionReport.INVALID_PARAMETER_VALUE,
|
|||
|
"identifier");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
for(String algorithmName : identifiers) {
|
|||
|
if(!RepositoryManager.getInstance().containsAlgorithm(algorithmName)) {
|
|||
|
throw new ExceptionReport("Algorithm does not exist: " + algorithmName,
|
|||
|
ExceptionReport.INVALID_PARAMETER_VALUE,
|
|||
|
"identifier");
|
|||
|
}
|
|||
|
ProcessDescriptionType description = RepositoryManager.getInstance().getProcessDescription(algorithmName);
|
|||
|
document.getProcessDescriptions().addNewProcessDescription().set(description);
|
|||
|
}
|
|||
|
|
|||
|
LOGGER.info("Handled Request successfully for: " + getMapValue("identifier", true));
|
|||
|
return new DescribeProcessResponse(this);
|
|||
|
}
|
|||
|
|
|||
|
}
|