All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eu.freme.common.rest.NIFParameterFactory Maven / Gradle / Ivy

/**
 * Copyright © 2015 Agro-Know, Deutsches Forschungszentrum für Künstliche Intelligenz, iMinds,
 * Institut für Angewandte Informatik e. V. an der Universität Leipzig,
 * Istituto Superiore Mario Boella, Tilde, Vistatec, WRIPL (http://freme-project.eu)
 *
 * 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 eu.freme.common.rest;

import eu.freme.common.conversion.SerializationFormatMapper;
import eu.freme.common.conversion.rdf.RDFConstants;
import eu.freme.common.exception.BadRequestException;
import eu.freme.common.exception.UnsupportedRDFSerializationException;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.validator.routines.UrlValidator;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import eu.freme.common.exception.NIFVersionNotSupportedException;

import static eu.freme.common.conversion.rdf.RDFConstants.SERIALIZATION_FORMATS;
import static eu.freme.common.conversion.rdf.RDFConstants.TURTLE;

/**
 * Helper class to create a NIFParameterSet according to the specification of NIF.
 * 
 * @author Jan Nehring - [email protected]
 */
public class NIFParameterFactory {

	@Autowired
	SerializationFormatMapper serializationFormatMapper;

	public final Set NIF_PARAMETERS = new HashSet<>(Arrays.asList(new String[]{
			"input", "i", "informat", "f", "outformat", "o", "prefix", "p"
	}));

	// name of the http parameter containing the nif Version
	public static final String versionIdentifier = "nif-version";


	public NIFParameterSet constructFromHttp(String input, String informat,
											 String outformat, String postBody, String acceptHeader,
											 String contentTypeHeader, String prefix) throws BadRequestException {
		return constructFromHttp(input, informat, outformat, postBody, acceptHeader, contentTypeHeader, prefix, false);
	}

	public NIFParameterSet constructFromHttp(String input, String informat,
											 String outformat, String postBody, String acceptHeader,
											 String contentTypeHeader, String prefix, boolean allowEmptyInput) throws BadRequestException {
		return constructFromHttp(input,informat,outformat,postBody,acceptHeader,contentTypeHeader,prefix, RDFConstants.nifVersion2_0, allowEmptyInput);

	}

	public NIFParameterSet constructFromHttp(String input, String informat,
			String outformat, String postBody, String acceptHeader,
			String contentTypeHeader, String prefix, String nifVersion, boolean allowEmptyInput) throws BadRequestException {

		String thisInput;
		if (!allowEmptyInput && input == null && postBody == null) {
			throw new BadRequestException("no input found in request");
		} else if (input != null) {
			thisInput = input;
		} else {
			thisInput = postBody;
		}

		String thisInformat;
		if (informat == null && contentTypeHeader == null) {
			thisInformat = TURTLE;
		} else if (informat != null) {
			thisInformat = serializationFormatMapper.get(informat);
			if (thisInformat==null) {
				throw new BadRequestException(
						"parameter informat has invalid value \"" + informat
								+ "\". Please use one of the registered serialization format values: "+serializationFormatMapper.keySet().stream().collect(Collectors.joining(", ")));
			}
		} else {
			String[] contentTypeHeaderParts = contentTypeHeader.split(";");
			thisInformat = serializationFormatMapper.get(contentTypeHeaderParts[0]);
			if (thisInformat==null) {
				throw new BadRequestException(
						"Content-Type header has invalid value \""
								+ contentTypeHeader + "\". Please use one of the registered serialization format values: "+serializationFormatMapper.keySet().stream().collect(Collectors.joining(", ")));
			}
		}
		if(!RDFConstants.SERIALIZATION_FORMATS.contains(thisInformat) && !thisInformat.equals(SerializationFormatMapper.PLAINTEXT)){
			throw new UnsupportedRDFSerializationException(
					"Parameter informat has invalid value \"" + thisInformat
							+ "\". Please use one of: "+SERIALIZATION_FORMATS.stream().map(v->MapUtils.invertMap(serializationFormatMapper).get(v).toString()).collect(Collectors.joining(", "))+" or "+SerializationFormatMapper.PLAINTEXT);
		}

		String thisOutformat;
		if( acceptHeader != null && acceptHeader.equals("*/*")){
			acceptHeader = TURTLE;
		}
		if (outformat == null && acceptHeader == null) {
			thisOutformat = TURTLE;
		} else if (outformat != null) {
			thisOutformat = serializationFormatMapper.get(outformat);
			if (thisOutformat==null) {
				throw new BadRequestException(
						"Parameter outformat has invalid value \"" + outformat
								+ "\". Please use one of the registered serialization format values: "+serializationFormatMapper.keySet().stream().collect(Collectors.joining(", ")));
			}
		} else {
			thisOutformat = serializationFormatMapper.get(acceptHeader.split(";")[0]);
			if (thisOutformat==null) {
				throw new BadRequestException(
						"Accept header has invalid value \""
								+ acceptHeader.split(";")[0] + "\". Please use one of the registered serialization format values: "+serializationFormatMapper.keySet().stream().collect(Collectors.joining(", ")));
			}
		}
		if(!RDFConstants.SERIALIZATION_FORMATS.contains(thisOutformat)){
			throw new UnsupportedRDFSerializationException(
					"Parameter outformat has invalid value \"" + thisOutformat
							+ "\". Please use one of: "+SERIALIZATION_FORMATS.stream().map(v->MapUtils.invertMap(serializationFormatMapper).get(v).toString()).collect(Collectors.joining(", ")));
		}

		String thisPrefix;
		if (prefix == null) {
			thisPrefix = getDefaultPrefix();
		} else{
			thisPrefix = prefix;
		}
		String[] schemes = {"http","https"};
		UrlValidator urlValidator = new UrlValidator(schemes);
		if (!urlValidator.isValid(thisPrefix)) {
			throw new BadRequestException("invalid prefix");
		}

		if (nifVersion == null){
			 nifVersion = RDFConstants.nifVersion2_0;
		}else if(!(nifVersion.equals(RDFConstants.nifVersion2_0) || nifVersion.equals(RDFConstants.nifVersion2_1))) {
			throw new NIFVersionNotSupportedException("NIF version \""
					+ nifVersion + "\" is not supported");
		}

		return new NIFParameterSet(thisInput, thisInformat, thisOutformat, thisPrefix, nifVersion);
	}

	public boolean isNIFParameter(String parameter){
		return NIF_PARAMETERS.contains(parameter);
	}

	public String getDefaultPrefix() {
		return RDFConstants.fremePrefix;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy