/**
* Copyright (C) 2007 - 2016 52°North Initiative for Geospatial Open Source
* Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.n52.wps.client.test;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import net.opengis.wps.x100.ComplexDataCombinationType;
import net.opengis.wps.x100.ComplexDataCombinationsType;
import net.opengis.wps.x100.ComplexDataDescriptionType;
import net.opengis.wps.x100.DocumentOutputDefinitionType;
import net.opengis.wps.x100.ExecuteDocument;
import net.opengis.wps.x100.ExecuteDocument.Execute;
import net.opengis.wps.x100.InputType;
import net.opengis.wps.x100.OutputDescriptionType;
import net.opengis.wps.x100.ProcessDescriptionType;
import net.opengis.wps.x100.ProcessDescriptionType.ProcessOutputs;
import net.opengis.wps.x100.ResponseDocumentType;
import net.opengis.wps.x100.ResponseFormType;
import net.opengis.wps.x100.SupportedComplexDataType;
import org.junit.Assert;
import org.junit.Test;
import org.n52.wps.client.ExecuteRequestBuilder;
import org.n52.wps.client.WPSClientException;
import org.n52.wps.server.algorithm.test.MultiReferenceBinaryInputAlgorithm;
public class ExecuteRequestBuilderTest {
private ProcessDescriptionType processDescriptionType = new MultiReferenceBinaryInputAlgorithm().getDescription();
private String inputID = processDescriptionType.getDataInputs().getInputArray(0).getIdentifier().getStringValue();
private String outputID = processDescriptionType.getProcessOutputs().getOutputArray(0).getIdentifier().getStringValue();
private String url = "http://xyz.test.data";
private String complexDataString = "testString";
@Test
public void addComplexDataInputByReference() {
ExecuteRequestBuilder executeRequestBuilder = new ExecuteRequestBuilder(processDescriptionType);
addTestDataByReference(executeRequestBuilder);
ExecuteDocument request = executeRequestBuilder.getExecute();
Assert.assertThat("generated doc contains input id", request.toString(), containsString(inputID));
Assert.assertThat("generated doc contains input url", request.toString(), containsString(url));
Assert.assertThat("document is valid", request.validate(), is(true));
}
@Test
public void addComplexDataInputString() {
ExecuteRequestBuilder executeRequestBuilder = new ExecuteRequestBuilder(processDescriptionType);
addTestDataString(executeRequestBuilder);
ExecuteDocument request = executeRequestBuilder.getExecute();
Assert.assertThat("generated doc contains input id", request.toString(), containsString(inputID));
Assert.assertThat("generated doc contains input string", request.toString(), containsString(complexDataString));
Assert.assertThat("document is valid", request.validate(), is(true));
}
@Test
public void setSupportedMimeTypeForOutput(){
ExecuteRequestBuilder executeRequestBuilder = new ExecuteRequestBuilder(processDescriptionType);
addTestDataByReference(executeRequestBuilder);
String mimeType = getMimeType(processDescriptionType, false);
executeRequestBuilder.setMimeTypeForOutput(mimeType, outputID);
ExecuteDocument request = executeRequestBuilder.getExecute();
checkOutputIdentifier(request.getExecute(), outputID);
checkOutputMimeType(request.getExecute(), mimeType);
Assert.assertThat("document is valid", request.validate(), is(true));
}
@Test
public void setDefaultMimeTypeForOutput(){
ExecuteRequestBuilder executeRequestBuilder = new ExecuteRequestBuilder(processDescriptionType);
addTestDataByReference(executeRequestBuilder);
String mimeType = getMimeType(processDescriptionType, true);
ExecuteDocument request = executeRequestBuilder.getExecute();
executeRequestBuilder.setMimeTypeForOutput(mimeType, outputID);
checkOutputIdentifier(request.getExecute(), outputID);
checkOutputMimeType(request.getExecute(), mimeType);
Assert.assertThat("document is valid", request.validate(), is(true));
}
private void addTestDataByReference(ExecuteRequestBuilder executeRequestBuilder){
InputType inputType = InputType.Factory.newInstance();
inputType.addNewIdentifier().setStringValue(inputID);
inputType.addNewReference().setHref(url);
executeRequestBuilder.addComplexData(inputType);
}
private void addTestDataString(ExecuteRequestBuilder executeRequestBuilder){
try {
executeRequestBuilder.addComplexData(inputID, complexDataString, "", "", "text/plain");
} catch (WPSClientException e) {
e.printStackTrace();
}
}
private String getMimeType(ProcessDescriptionType processDescriptionType, boolean isGetDefaultMimeType){
String result = "";
ProcessOutputs processOutputs = processDescriptionType.getProcessOutputs();
assertNotNull(processOutputs);
OutputDescriptionType outputDescriptionType = processOutputs.getOutputArray(0);
assertNotNull(outputDescriptionType);
SupportedComplexDataType complexDataType = outputDescriptionType.getComplexOutput();
assertNotNull(complexDataType);
if(isGetDefaultMimeType){
ComplexDataCombinationType defaultFormat = complexDataType.getDefault();
assertNotNull(defaultFormat);
ComplexDataDescriptionType format = defaultFormat.getFormat();
assertNotNull(format);
result = format.getMimeType();
}else{
ComplexDataCombinationsType supportedFormats = complexDataType.getSupported();
assertNotNull(supportedFormats);
ComplexDataDescriptionType format = supportedFormats.getFormatArray(0);
assertNotNull(format);
result = format.getMimeType();
}
return result;
}
private void checkOutputMimeType(Execute execute, String mimeType){
DocumentOutputDefinitionType outputDefinitionType = getOutputDefinitionType(execute);
assertTrue(outputDefinitionType.getMimeType() != null && outputDefinitionType.getMimeType().equals(mimeType));
}
private void checkOutputIdentifier(Execute execute, String identifier){
DocumentOutputDefinitionType outputDefinitionType = getOutputDefinitionType(execute);
assertTrue(outputDefinitionType.getIdentifier() != null && outputDefinitionType.getIdentifier().getStringValue().equals(identifier));
}
private DocumentOutputDefinitionType getOutputDefinitionType(Execute execute){
ResponseFormType responseFormType = execute.getResponseForm();
assertNotNull(responseFormType);
ResponseDocumentType responseDocumentType = responseFormType.getResponseDocument();
assertNotNull(responseDocumentType);
DocumentOutputDefinitionType outputDefinitionType = responseDocumentType.getOutputArray(0);
assertNotNull(outputDefinitionType);
return outputDefinitionType;
}
}