257 lines
9.3 KiB
Java
257 lines
9.3 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.response;
|
|||
|
|
|||
|
import static org.junit.Assert.assertTrue;
|
|||
|
|
|||
|
import java.net.URL;
|
|||
|
import java.util.ArrayList;
|
|||
|
import java.util.Calendar;
|
|||
|
import java.util.List;
|
|||
|
import java.util.Random;
|
|||
|
import java.util.UUID;
|
|||
|
|
|||
|
import javax.xml.XMLConstants;
|
|||
|
import javax.xml.namespace.QName;
|
|||
|
|
|||
|
import net.opengis.ows.x11.LanguageStringType;
|
|||
|
import net.opengis.wps.x100.ExecuteResponseDocument;
|
|||
|
import net.opengis.wps.x100.ExecuteResponseDocument.ExecuteResponse;
|
|||
|
import net.opengis.wps.x100.LiteralOutputType;
|
|||
|
import net.opengis.wps.x100.OutputDescriptionType;
|
|||
|
import net.opengis.wps.x100.ProcessBriefType;
|
|||
|
import net.opengis.wps.x100.ProcessDescriptionType;
|
|||
|
import net.opengis.wps.x100.ProcessDescriptionType.ProcessOutputs;
|
|||
|
import net.opengis.wps.x100.ProcessDescriptionsDocument;
|
|||
|
|
|||
|
import org.apache.xmlbeans.XmlCursor;
|
|||
|
import org.apache.xmlbeans.XmlOptions;
|
|||
|
import org.apache.xmlbeans.XmlValidationError;
|
|||
|
import org.junit.Before;
|
|||
|
import org.junit.Test;
|
|||
|
import org.n52.wps.io.BasicXMLTypeFactory;
|
|||
|
import org.n52.wps.io.data.ILiteralData;
|
|||
|
import org.n52.wps.io.data.binding.literal.LiteralAnyURIBinding;
|
|||
|
import org.n52.wps.io.data.binding.literal.LiteralBase64BinaryBinding;
|
|||
|
import org.n52.wps.io.data.binding.literal.LiteralBooleanBinding;
|
|||
|
import org.n52.wps.io.data.binding.literal.LiteralByteBinding;
|
|||
|
import org.n52.wps.io.data.binding.literal.LiteralDateTimeBinding;
|
|||
|
import org.n52.wps.io.data.binding.literal.LiteralDoubleBinding;
|
|||
|
import org.n52.wps.io.data.binding.literal.LiteralFloatBinding;
|
|||
|
import org.n52.wps.io.data.binding.literal.LiteralIntBinding;
|
|||
|
import org.n52.wps.io.data.binding.literal.LiteralLongBinding;
|
|||
|
import org.n52.wps.io.data.binding.literal.LiteralShortBinding;
|
|||
|
import org.n52.wps.io.data.binding.literal.LiteralStringBinding;
|
|||
|
import org.n52.wps.server.CapabilitiesConfiguration;
|
|||
|
import org.n52.wps.server.WebProcessingService;
|
|||
|
import org.n52.wps.server.request.Request;
|
|||
|
|
|||
|
/**
|
|||
|
* @author BenjaminPross(bpross-52n)
|
|||
|
*
|
|||
|
* This class is for testing the updateResponseForLiteralData() method of the class OutputDataItem.java.
|
|||
|
*
|
|||
|
*/
|
|||
|
public class OutputDataItemTest {
|
|||
|
|
|||
|
private ProcessDescriptionType descriptionsType;
|
|||
|
private String processID = "org.n52.wps.server.response.OutputDataItemTest";
|
|||
|
private ExecuteResponseDocument mockupResponseDocument;
|
|||
|
private LanguageStringType outputTitle = LanguageStringType.Factory
|
|||
|
.newInstance();
|
|||
|
private LanguageStringType processTitle = LanguageStringType.Factory
|
|||
|
.newInstance();
|
|||
|
private Random random = new Random();
|
|||
|
private List<ILiteralData> literalDataList;
|
|||
|
|
|||
|
@Before
|
|||
|
public void setUp() {
|
|||
|
|
|||
|
literalDataList = new ArrayList<ILiteralData>();
|
|||
|
|
|||
|
String url = "";
|
|||
|
try {
|
|||
|
url = "http://52north.org";
|
|||
|
literalDataList.add(new LiteralAnyURIBinding(new URL(url).toURI()));
|
|||
|
} catch (Exception e1) {
|
|||
|
System.out.println(url + " caused " + e1);
|
|||
|
}
|
|||
|
|
|||
|
String uuid = UUID.randomUUID().toString();
|
|||
|
|
|||
|
literalDataList.add(new LiteralBase64BinaryBinding(uuid.getBytes()));
|
|||
|
literalDataList.add(new LiteralBooleanBinding(true));
|
|||
|
literalDataList.add(new LiteralByteBinding((byte) 127));
|
|||
|
literalDataList.add(new LiteralDateTimeBinding(Calendar.getInstance()
|
|||
|
.getTime()));
|
|||
|
literalDataList.add(new LiteralDoubleBinding(random.nextDouble()));
|
|||
|
literalDataList.add(new LiteralFloatBinding(random.nextFloat()));
|
|||
|
literalDataList.add(new LiteralIntBinding(random.nextInt()));
|
|||
|
literalDataList.add(new LiteralLongBinding(random.nextLong()));
|
|||
|
literalDataList.add(new LiteralShortBinding((short) random.nextInt(Short.MAX_VALUE + 1)));
|
|||
|
literalDataList.add(new LiteralStringBinding(uuid));
|
|||
|
|
|||
|
outputTitle.setStringValue("output title");
|
|||
|
processTitle.setStringValue("process title");
|
|||
|
|
|||
|
ProcessDescriptionsDocument descriptionsDocument = ProcessDescriptionsDocument.Factory
|
|||
|
.newInstance();
|
|||
|
descriptionsType = descriptionsDocument.addNewProcessDescriptions()
|
|||
|
.addNewProcessDescription();
|
|||
|
|
|||
|
descriptionsType.addNewIdentifier().setStringValue(processID);
|
|||
|
|
|||
|
mockupResponseDocument = createExecuteResponseDocument();
|
|||
|
}
|
|||
|
|
|||
|
private ExecuteResponseDocument createExecuteResponseDocument() {
|
|||
|
|
|||
|
ExecuteResponseDocument doc = ExecuteResponseDocument.Factory
|
|||
|
.newInstance();
|
|||
|
ExecuteResponse responseElem = doc.addNewExecuteResponse();
|
|||
|
XmlCursor c = doc.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/wpsExecute_response.xsd");
|
|||
|
responseElem.setServiceInstance(CapabilitiesConfiguration.ENDPOINT_URL
|
|||
|
+ "?REQUEST=GetCapabilities&SERVICE=WPS");
|
|||
|
responseElem.setLang(WebProcessingService.DEFAULT_LANGUAGE);
|
|||
|
responseElem.setService("WPS");
|
|||
|
responseElem.setVersion(Request.SUPPORTED_VERSION);
|
|||
|
ProcessBriefType process = responseElem.addNewProcess();
|
|||
|
process.addNewIdentifier().setStringValue(processID);
|
|||
|
process.setProcessVersion("1.0.0");
|
|||
|
process.setTitle(processTitle);
|
|||
|
responseElem.addNewStatus().setProcessSucceeded("Process successful");
|
|||
|
responseElem.getStatus().setCreationTime(Calendar.getInstance());
|
|||
|
|
|||
|
responseElem.addNewProcessOutputs();
|
|||
|
|
|||
|
return doc;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
@Test
|
|||
|
public void testUpdateResponseForLiteralData() {
|
|||
|
|
|||
|
for (ILiteralData literalData : literalDataList) {
|
|||
|
|
|||
|
try {
|
|||
|
testLiteralOutput(literalData);
|
|||
|
} catch (Exception e) {
|
|||
|
System.out.println("Test failed for " + literalData.getClass()
|
|||
|
+ " " + e);
|
|||
|
}
|
|||
|
|
|||
|
mockupResponseDocument.getExecuteResponse().getProcessOutputs()
|
|||
|
.removeOutput(0);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void testLiteralOutput(ILiteralData literalDataBinding)
|
|||
|
throws Exception {
|
|||
|
|
|||
|
String startText = "Testing " + literalDataBinding.getClass()
|
|||
|
+ " and value ";
|
|||
|
|
|||
|
String endText = "ResponseDocument valid for "
|
|||
|
+ literalDataBinding.getClass() + " and value ";
|
|||
|
|
|||
|
if (literalDataBinding.getPayload() instanceof byte[]) {
|
|||
|
|
|||
|
byte[] bytes = (byte[]) literalDataBinding.getPayload();
|
|||
|
|
|||
|
String bytesAsIntegerValues = "[";
|
|||
|
|
|||
|
for (int i = 0; i < bytes.length; i++) {
|
|||
|
if(i < bytes.length -1){
|
|||
|
bytesAsIntegerValues = bytesAsIntegerValues
|
|||
|
.concat((int) bytes[i] + ", ");
|
|||
|
}else{
|
|||
|
bytesAsIntegerValues = bytesAsIntegerValues
|
|||
|
.concat((int) bytes[i] + "]");
|
|||
|
}
|
|||
|
}
|
|||
|
startText = startText.concat("" + bytesAsIntegerValues);
|
|||
|
endText = endText.concat("" + bytesAsIntegerValues);
|
|||
|
} else {
|
|||
|
startText = startText.concat("" + literalDataBinding.getPayload());
|
|||
|
endText = endText.concat("" + literalDataBinding.getPayload());
|
|||
|
}
|
|||
|
|
|||
|
System.out.println(startText);
|
|||
|
|
|||
|
ProcessOutputs processOutputs = descriptionsType.addNewProcessOutputs();
|
|||
|
OutputDescriptionType outputDescType = processOutputs.addNewOutput();
|
|||
|
outputDescType.addNewIdentifier().setStringValue("output");
|
|||
|
LiteralOutputType outputType = outputDescType.addNewLiteralOutput();
|
|||
|
|
|||
|
String dataTypeAsString = BasicXMLTypeFactory
|
|||
|
.getXMLDataTypeforBinding(literalDataBinding.getClass());
|
|||
|
|
|||
|
outputType.addNewDataType().setStringValue(dataTypeAsString);
|
|||
|
|
|||
|
OutputDataItem ouDI = new OutputDataItem(literalDataBinding, "output",
|
|||
|
null, null, null, outputTitle, processID, descriptionsType);
|
|||
|
|
|||
|
ouDI.updateResponseForLiteralData(mockupResponseDocument,
|
|||
|
dataTypeAsString);
|
|||
|
|
|||
|
assertTrue(validateResponseDocument(mockupResponseDocument));
|
|||
|
|
|||
|
System.out.println(endText);
|
|||
|
System.out.println();
|
|||
|
}
|
|||
|
|
|||
|
private boolean validateResponseDocument(ExecuteResponseDocument doc) {
|
|||
|
XmlOptions xmlOptions = new XmlOptions();
|
|||
|
List<XmlValidationError> xmlValidationErrorList = new ArrayList<XmlValidationError>();
|
|||
|
xmlOptions.setErrorListener(xmlValidationErrorList);
|
|||
|
boolean valid = doc.validate(xmlOptions);
|
|||
|
if (!valid) {
|
|||
|
System.err
|
|||
|
.println("Error validating ExecuteResponseDocument for data type"
|
|||
|
+ doc.getExecuteResponse().getProcessOutputs()
|
|||
|
.getOutputArray(0).getData()
|
|||
|
.getLiteralData().getDataType());
|
|||
|
for (XmlValidationError xmlValidationError : xmlValidationErrorList) {
|
|||
|
System.err.println("\tMessage: "
|
|||
|
+ xmlValidationError.getMessage());
|
|||
|
System.err.println("\tLocation of invalid XML: "
|
|||
|
+ xmlValidationError.getCursorLocation().xmlText());
|
|||
|
}
|
|||
|
}
|
|||
|
return valid;
|
|||
|
}
|
|||
|
|
|||
|
}
|