360 lines
13 KiB
Java
360 lines
13 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 java.util.ArrayList;
|
|||
|
import java.util.List;
|
|||
|
|
|||
|
import net.opengis.wps.x100.ComplexDataDescriptionType;
|
|||
|
import net.opengis.wps.x100.OutputDescriptionType;
|
|||
|
import net.opengis.wps.x100.ProcessDescriptionType;
|
|||
|
|
|||
|
import org.slf4j.Logger;
|
|||
|
import org.slf4j.LoggerFactory;
|
|||
|
import org.n52.wps.io.GeneratorFactory;
|
|||
|
import org.n52.wps.io.IGenerator;
|
|||
|
import org.n52.wps.io.data.IData;
|
|||
|
import org.n52.wps.server.ExceptionReport;
|
|||
|
import org.n52.wps.server.RepositoryManager;
|
|||
|
|
|||
|
/*
|
|||
|
* @author foerster
|
|||
|
* This and the inheriting classes in charge of populating the ExecuteResponseDocument.
|
|||
|
*/
|
|||
|
public abstract class ResponseData {
|
|||
|
|
|||
|
private static Logger LOGGER = LoggerFactory.getLogger(ResponseData.class);
|
|||
|
|
|||
|
protected IData obj = null;
|
|||
|
protected String id;
|
|||
|
protected String schema;
|
|||
|
protected String encoding;
|
|||
|
protected String mimeType;
|
|||
|
protected IGenerator generator = null;
|
|||
|
protected String algorithmIdentifier = null;
|
|||
|
protected ProcessDescriptionType description = null;
|
|||
|
|
|||
|
|
|||
|
public ResponseData(IData obj, String id, String schema, String encoding,
|
|||
|
String mimeType, String algorithmIdentifier, ProcessDescriptionType description) throws ExceptionReport {
|
|||
|
|
|||
|
this.obj = obj;
|
|||
|
this.id = id;
|
|||
|
this.algorithmIdentifier = algorithmIdentifier;
|
|||
|
this.description = description;
|
|||
|
this.encoding = encoding;
|
|||
|
|
|||
|
OutputDescriptionType outputType =null;
|
|||
|
|
|||
|
OutputDescriptionType[] describeProcessOutput = description.getProcessOutputs().getOutputArray();
|
|||
|
for(OutputDescriptionType tempOutputType : describeProcessOutput){
|
|||
|
if(tempOutputType.getIdentifier().getStringValue().equalsIgnoreCase(id)){
|
|||
|
outputType = tempOutputType;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//select generator
|
|||
|
|
|||
|
//0. complex output set? --> no: skip
|
|||
|
//1. mimeType set?
|
|||
|
//yes--> set it
|
|||
|
//1.1 schema/encoding set?
|
|||
|
//yes-->set it
|
|||
|
//not-->set default values for parser with matching mime type
|
|||
|
|
|||
|
//no--> schema or/and encoding are set?
|
|||
|
//yes-->use it, look if only one mime type can be found
|
|||
|
//not-->use default values
|
|||
|
|
|||
|
|
|||
|
String finalSchema = null;
|
|||
|
String finalMimeType = null;
|
|||
|
String finalEncoding = null;
|
|||
|
|
|||
|
if (outputType.isSetComplexOutput()){
|
|||
|
if (mimeType != null){
|
|||
|
//mime type in request
|
|||
|
ComplexDataDescriptionType format = null;
|
|||
|
|
|||
|
String defaultMimeType = outputType.getComplexOutput().getDefault().getFormat().getMimeType();
|
|||
|
|
|||
|
boolean canUseDefault = false;
|
|||
|
if(defaultMimeType.equalsIgnoreCase(mimeType)){
|
|||
|
ComplexDataDescriptionType potenitalFormat = outputType.getComplexOutput().getDefault().getFormat();
|
|||
|
if(schema != null && encoding == null){
|
|||
|
if(schema.equalsIgnoreCase(potenitalFormat.getSchema())){
|
|||
|
canUseDefault = true;
|
|||
|
format = potenitalFormat;
|
|||
|
}
|
|||
|
}
|
|||
|
if(schema == null && encoding != null){
|
|||
|
if(encoding.equalsIgnoreCase(potenitalFormat.getEncoding())){
|
|||
|
canUseDefault = true;
|
|||
|
format = potenitalFormat;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if(schema != null && encoding != null){
|
|||
|
if(schema.equalsIgnoreCase(potenitalFormat.getSchema()) && encoding.equalsIgnoreCase(potenitalFormat.getEncoding())){
|
|||
|
canUseDefault = true;
|
|||
|
format = potenitalFormat;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if(schema == null && encoding == null){
|
|||
|
canUseDefault = true;
|
|||
|
format = potenitalFormat;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if(!canUseDefault){
|
|||
|
ComplexDataDescriptionType[] formats =outputType.getComplexOutput().getSupported().getFormatArray();
|
|||
|
for(ComplexDataDescriptionType potenitalFormat : formats){
|
|||
|
if(potenitalFormat.getMimeType().equalsIgnoreCase(mimeType)){
|
|||
|
if(schema != null && encoding == null){
|
|||
|
if(schema.equalsIgnoreCase(potenitalFormat.getSchema())){
|
|||
|
format = potenitalFormat;
|
|||
|
}
|
|||
|
}
|
|||
|
if(schema == null && encoding != null){
|
|||
|
if(encoding.equalsIgnoreCase(potenitalFormat.getEncoding()) || potenitalFormat.getEncoding() == null){
|
|||
|
format = potenitalFormat;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if(schema != null && encoding != null){
|
|||
|
if(schema.equalsIgnoreCase(potenitalFormat.getSchema()) && ((encoding.equalsIgnoreCase(potenitalFormat.getEncoding()) || potenitalFormat.getEncoding() == null) )){
|
|||
|
format = potenitalFormat;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if(schema == null && encoding == null){
|
|||
|
format = potenitalFormat;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if(format == null){
|
|||
|
throw new ExceptionReport("Could not determine output format", ExceptionReport.INVALID_PARAMETER_VALUE);
|
|||
|
}
|
|||
|
|
|||
|
finalMimeType = format.getMimeType();
|
|||
|
|
|||
|
if(format.isSetEncoding()){
|
|||
|
//no encoding provided--> select default one for mimeType
|
|||
|
finalEncoding = format.getEncoding();
|
|||
|
}
|
|||
|
|
|||
|
if(format.isSetSchema()){
|
|||
|
//no encoding provided--> select default one for mimeType
|
|||
|
finalSchema = format.getSchema();
|
|||
|
}
|
|||
|
|
|||
|
}else{
|
|||
|
|
|||
|
//mimeType not in request
|
|||
|
if(mimeType==null && encoding==null && schema == null){
|
|||
|
//nothing set, use default values
|
|||
|
finalSchema = outputType.getComplexOutput().getDefault().getFormat().getSchema();
|
|||
|
finalMimeType = outputType.getComplexOutput().getDefault().getFormat().getMimeType();
|
|||
|
finalEncoding = outputType.getComplexOutput().getDefault().getFormat().getEncoding();
|
|||
|
|
|||
|
}else{
|
|||
|
//do a smart search an look if a mimeType can be found for either schema and/or encoding
|
|||
|
|
|||
|
if(mimeType==null){
|
|||
|
if(encoding!=null && schema==null){
|
|||
|
//encoding set only
|
|||
|
ComplexDataDescriptionType encodingFormat = null;
|
|||
|
String defaultEncoding = outputType.getComplexOutput().getDefault().getFormat().getEncoding();
|
|||
|
int found = 0;
|
|||
|
String foundEncoding = null;
|
|||
|
if(defaultEncoding.equalsIgnoreCase(encoding)){
|
|||
|
foundEncoding = outputType.getComplexOutput().getDefault().getFormat().getEncoding();
|
|||
|
encodingFormat = outputType.getComplexOutput().getDefault().getFormat();
|
|||
|
found = found +1;
|
|||
|
}else{
|
|||
|
ComplexDataDescriptionType[] formats = outputType.getComplexOutput().getSupported().getFormatArray();
|
|||
|
for(ComplexDataDescriptionType tempFormat : formats){
|
|||
|
if(tempFormat.getEncoding().equalsIgnoreCase(encoding)){
|
|||
|
foundEncoding = tempFormat.getEncoding();
|
|||
|
encodingFormat = tempFormat;
|
|||
|
found = found +1;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if(found == 1){
|
|||
|
finalEncoding = foundEncoding;
|
|||
|
finalMimeType = encodingFormat.getMimeType();
|
|||
|
if(encodingFormat.isSetSchema()){
|
|||
|
finalSchema = encodingFormat.getSchema();
|
|||
|
}
|
|||
|
}else{
|
|||
|
throw new ExceptionReport("Request incomplete. Could not determine a suitable input format based on the given input [mime Type missing and given encoding not unique]", ExceptionReport.MISSING_PARAMETER_VALUE);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if(schema != null && encoding==null){
|
|||
|
//schema set only
|
|||
|
ComplexDataDescriptionType schemaFormat = null;
|
|||
|
String defaultSchema = outputType.getComplexOutput().getDefault().getFormat().getSchema();
|
|||
|
int found = 0;
|
|||
|
String foundSchema = null;
|
|||
|
if(defaultSchema.equalsIgnoreCase(schema)){
|
|||
|
foundSchema = outputType.getComplexOutput().getDefault().getFormat().getSchema();
|
|||
|
schemaFormat = outputType.getComplexOutput().getDefault().getFormat();
|
|||
|
found = found +1;
|
|||
|
}else{
|
|||
|
ComplexDataDescriptionType[] formats = outputType.getComplexOutput().getSupported().getFormatArray();
|
|||
|
for(ComplexDataDescriptionType tempFormat : formats){
|
|||
|
if(tempFormat.getEncoding().equalsIgnoreCase(schema)){
|
|||
|
foundSchema = tempFormat.getSchema();
|
|||
|
schemaFormat =tempFormat;
|
|||
|
found = found +1;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if(found == 1){
|
|||
|
finalSchema = foundSchema;
|
|||
|
finalMimeType = schemaFormat.getMimeType();
|
|||
|
if(schemaFormat.isSetEncoding()){
|
|||
|
finalEncoding = schemaFormat.getEncoding();
|
|||
|
}
|
|||
|
}else{
|
|||
|
throw new ExceptionReport("Request incomplete. Could not determine a suitable input format based on the given input [mime Type missing and given schema not unique]", ExceptionReport.MISSING_PARAMETER_VALUE);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if(encoding!=null && schema!=null){
|
|||
|
//schema and encoding set
|
|||
|
|
|||
|
|
|||
|
//encoding
|
|||
|
String defaultEncoding = outputType.getComplexOutput().getDefault().getFormat().getEncoding();
|
|||
|
|
|||
|
List<ComplexDataDescriptionType> foundEncodingList = new ArrayList<ComplexDataDescriptionType>();
|
|||
|
if(defaultEncoding.equalsIgnoreCase(encoding)){
|
|||
|
foundEncodingList.add(outputType.getComplexOutput().getDefault().getFormat());
|
|||
|
|
|||
|
|
|||
|
}else{
|
|||
|
ComplexDataDescriptionType[] formats = outputType.getComplexOutput().getSupported().getFormatArray();
|
|||
|
for(ComplexDataDescriptionType tempFormat : formats){
|
|||
|
if(tempFormat.getEncoding().equalsIgnoreCase(encoding)){
|
|||
|
foundEncodingList.add(tempFormat);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//schema
|
|||
|
List<ComplexDataDescriptionType> foundSchemaList = new ArrayList<ComplexDataDescriptionType>();
|
|||
|
String defaultSchema = outputType.getComplexOutput().getDefault().getFormat().getSchema();
|
|||
|
if(defaultSchema.equalsIgnoreCase(schema)){
|
|||
|
foundSchemaList.add(outputType.getComplexOutput().getDefault().getFormat());
|
|||
|
}else{
|
|||
|
formats = outputType.getComplexOutput().getSupported().getFormatArray();
|
|||
|
for(ComplexDataDescriptionType tempFormat : formats){
|
|||
|
if(tempFormat.getEncoding().equalsIgnoreCase(schema)){
|
|||
|
foundSchemaList.add(tempFormat);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//results
|
|||
|
ComplexDataDescriptionType foundCommonFormat = null;
|
|||
|
for(ComplexDataDescriptionType encodingFormat : foundEncodingList){
|
|||
|
for(ComplexDataDescriptionType schemaFormat : foundSchemaList){
|
|||
|
if(encodingFormat.equals(schemaFormat)){
|
|||
|
foundCommonFormat = encodingFormat;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if(foundCommonFormat!=null){
|
|||
|
mimeType = foundCommonFormat.getMimeType();
|
|||
|
if(foundCommonFormat.isSetEncoding()){
|
|||
|
finalEncoding = foundCommonFormat.getEncoding();
|
|||
|
}
|
|||
|
if(foundCommonFormat.isSetSchema()){
|
|||
|
finalSchema = foundCommonFormat.getSchema();
|
|||
|
}
|
|||
|
}else{
|
|||
|
throw new ExceptionReport("Request incomplete. Could not determine a suitable input format based on the given input [mime Type missing and given encoding and schema are not unique]", ExceptionReport.MISSING_PARAMETER_VALUE);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
this.schema = finalSchema;
|
|||
|
if(this.encoding==null){
|
|||
|
this.encoding = finalEncoding;
|
|||
|
}
|
|||
|
this.mimeType = finalMimeType;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
protected void prepareGenerator() throws ExceptionReport {
|
|||
|
Class<?> algorithmOutput = RepositoryManager.getInstance().getOutputDataTypeForAlgorithm(this.algorithmIdentifier, id);
|
|||
|
|
|||
|
LOGGER.debug("Looking for matching Generator: schema: {}, mimeType {}, encoding: {}", schema, mimeType, encoding);
|
|||
|
|
|||
|
GeneratorFactory factory = GeneratorFactory.getInstance();
|
|||
|
this.generator = factory.getGenerator(this.schema, this.mimeType, this.encoding, algorithmOutput);
|
|||
|
|
|||
|
if(this.generator != null){
|
|||
|
LOGGER.info("Using generator " + generator.getClass().getName() + " for Schema: " + schema);
|
|||
|
}
|
|||
|
if(this.generator == null) {
|
|||
|
throw new ExceptionReport("Could not find an appropriate generator based on given mimetype/schema/encoding for output", ExceptionReport.NO_APPLICABLE_CODE);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|