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

org.eclipse.rdf4j.http.protocol.Protocol Maven / Gradle / Ivy

There is a newer version: 5.1.0
Show newest version
/*******************************************************************************
 * Copyright (c) 2015 Eclipse RDF4J contributors, Aduna, and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Distribution License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *******************************************************************************/
package org.eclipse.rdf4j.http.protocol;

import org.eclipse.rdf4j.OpenRDFUtil;
import org.eclipse.rdf4j.model.BNode;
import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Resource;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.model.ValueFactory;
import org.eclipse.rdf4j.rio.ntriples.NTriplesUtil;

public abstract class Protocol {

	/**
	 * Defines the action a particular transaction update is executing.
	 *
	 * @author Jeen Broekstra
	 */
	public static enum Action {
		/** adding data */
		ADD,
		/** deleting data */
		DELETE,
		/** getStatements or exportStatements */
		GET,
		/** retrieving repository size */
		SIZE,
		/** SPARQL or SeRQL query */
		QUERY,
		/** SPARQL Update */
		UPDATE,
		/** commit */
		COMMIT,
		/** rollback */
		ROLLBACK;
	}

	/**
	 * Protocol version.
	 */
	public static final String VERSION = "8";

	/**
	 * Parameter name for the 'subject' parameter of a statement query.
	 */
	public static final String SUBJECT_PARAM_NAME = "subj";

	/**
	 * Parameter name for the 'predicate' parameter of a statement query.
	 */
	public static final String PREDICATE_PARAM_NAME = "pred";

	/**
	 * Parameter name for the 'object' parameter of statement query.
	 */
	public static final String OBJECT_PARAM_NAME = "obj";

	/**
	 * Parameter name for the 'includeInferred' parameter.
	 */
	public static final String INCLUDE_INFERRED_PARAM_NAME = "infer";

	/**
	 * Parameter name for the context parameter.
	 */
	public static final String CONTEXT_PARAM_NAME = "context";

	/**
	 * Parameter value for the NULL context.
	 */
	public static final String NULL_PARAM_VALUE = "null";

	/**
	 * Parameter name for the graph parameter.
	 */
	public static final String GRAPH_PARAM_NAME = "graph";

	/**
	 * Parameter name for the update parameter.
	 */
	public static final String UPDATE_PARAM_NAME = "update";

	/**
	 * Parameter name for the base-URI parameter.
	 */
	public static final String BASEURI_PARAM_NAME = "baseURI";

	/**
	 * Parameter name for the query parameter.
	 */
	public static final String QUERY_PARAM_NAME = "query";

	public static final String LIMIT_PARAM_NAME = "limit";
	
	public static final String OFFSET_PARAM_NAME = "offset";
	
	/**
	 * Parameter name for the query language parameter.
	 */
	public static final String QUERY_LANGUAGE_PARAM_NAME = "queryLn";

	public static final String TIMEOUT_PARAM_NAME = "timeout";

	/**
	 * Parameter name for the default remove graph URI parameter.
	 */
	public static final String REMOVE_GRAPH_PARAM_NAME = "remove-graph-uri";

	/**
	 * Parameter name for the default insert graph URI parameter.
	 */
	public static final String INSERT_GRAPH_PARAM_NAME = "insert-graph-uri";

	/**
	 * Parameter name for the default graph URI parameter for update.
	 */
	public static final String USING_GRAPH_PARAM_NAME = "using-graph-uri";

	/**
	 * Parameter name for the named graph URI parameter for update.
	 */
	public static final String USING_NAMED_GRAPH_PARAM_NAME = "using-named-graph-uri";

	/**
	 * Parameter name for the default graph URI parameter.
	 */
	public static final String DEFAULT_GRAPH_PARAM_NAME = "default-graph-uri";

	/**
	 * Parameter name for the named graph URI parameter.
	 */
	public static final String NAMED_GRAPH_PARAM_NAME = "named-graph-uri";

	/**
	 * Parameter name for the Accept parameter (may also be used as the name of the Accept HTTP header).
	 */
	public static final String ACCEPT_PARAM_NAME = "Accept";

	/**
	 * Parameter name for the isolation level used in transactions.
	 */
	public static final String ISOLATION_LEVEL_PARAM_NAME = "isolation-level";

	/**
	 * Parameter name for the action parameter used in transactions.
	 */
	public static final String ACTION_PARAM_NAME = "action";

	/**
	 * Parameter name for the distinct parameter.
	 */
	public static final String DISTINCT_PARAM_NAME = "distinct";

	/**
	 * Relative location of the protocol resource.
	 */
	public static final String PROTOCOL = "protocol";

	/**
	 * Relative location of the config resource.
	 */
	public static final String CONFIG = "config";

	/**
	 * Relative location of the repository list resource.
	 */
	public static final String REPOSITORIES = "repositories";

	/**
	 * Relative location of the statement list resource of a repository.
	 */
	public static final String STATEMENTS = "statements";

	/**
	 * Relative location of the transaction resources of a repository.
	 */
	public static final String TRANSACTIONS = "transactions";

	/**
	 * Relative location of the context list resource of a repository.
	 */
	public static final String CONTEXTS = "contexts";

	/**
	 * Relative location of the namespaces list resource of a repository.
	 */
	public static final String NAMESPACES = "namespaces";

	/**
	 * Parameter prefix for query-external variable bindings.
	 */
	public static final String BINDING_PREFIX = "$";

	/**
	 * Relative location of the 'size' resource of a repository.
	 */
	public static final String SIZE = "size";

	/**
	 * MIME type for transactions: application/x-rdftransaction.
	 */
	public static final String TXN_MIME_TYPE = "application/x-rdftransaction";

	/**
	 * MIME type for www forms: application/x-www-form-urlencoded.
	 */
	public static final String FORM_MIME_TYPE = "application/x-www-form-urlencoded";

	/**
	 * MIME type for SPARQL update: application/sparql-query.
	 */
	public static final String SPARQL_QUERY_MIME_TYPE = "application/sparql-query";

	/**
	 * MIME type for SPARQL update: application/sparql-update.
	 */
	public static final String SPARQL_UPDATE_MIME_TYPE = "application/sparql-update";

	/**
	 * Parameter for server instruction to preserve blank node ids when parsing request data.
	 */
	public static final String PRESERVE_BNODE_ID_PARAM_NAME = "preserveNodeId";

	private static String getServerDir(String serverLocation) {
		if (serverLocation.endsWith("/")) {
			return serverLocation;
		}
		else {
			return serverLocation + "/";
		}
	}

	/**
	 * Get the location of the protocol resource on the specified server.
	 * 
	 * @param serverLocation
	 *        the base location of a server implementing this REST protocol.
	 * @return the location of the protocol resource on the specified server
	 */
	public static final String getProtocolLocation(String serverLocation) {
		return getServerDir(serverLocation) + PROTOCOL;
	}

	/**
	 * Get the location of the server configuration resource on the specified server.
	 * 
	 * @param serverLocation
	 *        the base location of a server implementing this REST protocol.
	 * @return the location of the server configuration resource on the specified server
	 */
	public static final String getConfigLocation(String serverLocation) {
		return getServerDir(serverLocation) + CONFIG;
	}

	/**
	 * Get the location of the repository list resource on the specified server.
	 * 
	 * @param serverLocation
	 *        the base location of a server implementing this REST protocol.
	 * @return the location of the repository list resource on the specified server
	 */
	public static final String getRepositoriesLocation(String serverLocation) {
		return getServerDir(serverLocation) + REPOSITORIES;
	}

	/**
	 * Get the location of a specific repository resource on the specified server.
	 * 
	 * @param serverLocation
	 *        the base location of a server implementing this REST protocol.
	 * @param repositoryID
	 *        the ID of the repository
	 * @return the location of a specific repository resource on the specified server
	 */
	public static final String getRepositoryLocation(String serverLocation, String repositoryID) {
		return getRepositoriesLocation(serverLocation) + "/" + repositoryID;
	}

	/**
	 * Get the location of the statements resource for a specific repository.
	 * 
	 * @param repositoryLocation
	 *        the location of a repository implementing this REST protocol.
	 * @return the location of the statements resource for the specified repository
	 */
	public static final String getStatementsLocation(String repositoryLocation) {
		return repositoryLocation + "/" + STATEMENTS;
	}

	/**
	 * Get the location of the transaction resources for a specific repository.
	 * 
	 * @param repositoryLocation
	 *        the location of a repository implementing this REST protocol.
	 * @return the location of the transaction resources for the specified repository
	 */
	public static final String getTransactionsLocation(String repositoryLocation) {
		return repositoryLocation + "/" + TRANSACTIONS;
	}

	/**
	 * Extracts the server location from the repository location.
	 * 
	 * @param repositoryLocation
	 *        the location of a repository implementing this REST protocol.
	 * @return the location of the server resource for the specified repository.
	 */
	public static final String getServerLocation(String repositoryLocation) {
		String serverLocation = repositoryLocation.substring(0, repositoryLocation.lastIndexOf('/'));
		serverLocation = serverLocation.substring(0, serverLocation.lastIndexOf('/'));
		return serverLocation;
	}

	/**
	 * Extracts the repository ID from the repository location.
	 * 
	 * @param repositoryLocation
	 *        the location of a repository implementing this REST protocol.
	 * @return the ID of the repository.
	 */
	public static final String getRepositoryID(String repositoryLocation) {
		String repositoryID = repositoryLocation.substring(repositoryLocation.lastIndexOf('/') + 1);
		return repositoryID;
	}

	/**
	 * Get the location of the contexts lists resource for a specific repository.
	 * 
	 * @param repositoryLocation
	 *        the location of a repository implementing this REST protocol.
	 * @return the location of the contexts lists resource for the specified repository
	 */
	public static final String getContextsLocation(String repositoryLocation) {
		return repositoryLocation + "/" + CONTEXTS;
	}

	/**
	 * Get the location of the namespaces lists resource for a specific repository on the specified server.
	 * 
	 * @param repositoryLocation
	 *        the base location of a server implementing this REST protocol.
	 * @return the location of the namespaces lists resource for a specific repository on the specified server
	 */
	public static final String getNamespacesLocation(String repositoryLocation) {
		return repositoryLocation + "/" + NAMESPACES;
	}

	/**
	 * Get the location of the namespace with the specified prefix for a specific repository on the specified
	 * server.
	 * 
	 * @param repositoryLocation
	 *        the location of a repository implementing this REST protocol.
	 * @param prefix
	 *        the namespace prefix
	 * @return the location of the the namespace with the specified prefix for a specific repository on the
	 *         specified server
	 */
	public static final String getNamespacePrefixLocation(String repositoryLocation, String prefix) {
		return getNamespacesLocation(repositoryLocation) + "/" + prefix;
	}

	/**
	 * Get the location of the 'size' resource for a specific repository on the specified server.
	 * 
	 * @param repositoryLocation
	 *        the location of a repository implementing this REST protocol.
	 * @return the location of the 'size' resource for a specific repository on the specified server
	 */
	public static final String getSizeLocation(String repositoryLocation) {
		return repositoryLocation + "/" + SIZE;
	}

	/**
	 * Encodes a value in a canonical serialized string format, for use in a URL query parameter.
	 * 
	 * @param value
	 *        The value to encode, possibly null.
	 * @return The protocol-serialized representation of the supplied value, or {@link #NULL_PARAM_VALUE} if
	 *         the supplied value was null.
	 */
	public static String encodeValue(Value value) {
		if (value instanceof BNode) {
			// SES-2129 special treatment of blank node names to avoid problems with round-tripping.
			return "_:" + ((BNode)value).getID();
		}

		// for everything else we just use N-Triples serialization.
		return NTriplesUtil.toNTriplesString(value);
	}

	/**
	 * Decode a previously encoded value.
	 * 
	 * @param encodedValue
	 *        the encoded value
	 * @param valueFactory
	 *        the factory to use for constructing the Value
	 * @return the decoded Value
	 * @see #encodeValue(Value)
	 */
	public static Value decodeValue(String encodedValue, ValueFactory valueFactory) {
		if (encodedValue != null) {
			return NTriplesUtil.parseValue(encodedValue, valueFactory);
		}

		return null;
	}

	/**
	 * Decode a previously encoded Resource.
	 * 
	 * @param encodedValue
	 *        the encoded value
	 * @param valueFactory
	 *        the factory to use for constructing the Resource
	 * @return the decoded Resource
	 * @see #encodeValue(Value)
	 */
	public static Resource decodeResource(String encodedValue, ValueFactory valueFactory) {
		if (encodedValue != null) {
			return NTriplesUtil.parseResource(encodedValue, valueFactory);
		}

		return null;
	}

	/**
	 * Decode a previously encoded URI.
	 * 
	 * @param encodedValue
	 *        the encoded value
	 * @param valueFactory
	 *        the factory to use for constructing the URI
	 * @return the decoded URI
	 * @see #encodeValue(Value)
	 */
	public static IRI decodeURI(String encodedValue, ValueFactory valueFactory) {
		if (encodedValue != null) {
			return NTriplesUtil.parseURI(encodedValue, valueFactory);
		}

		return null;
	}

	/**
	 * Encodes a context resource for use in a URL.
	 * 
	 * @param context
	 *        The context to encode, possibly null.
	 * @return The protocol-serialized representation of the supplied context, or {@link #NULL_PARAM_VALUE} if
	 *         the supplied value was null.
	 */
	public static String encodeContext(Resource context) {
		if (context == null) {
			return Protocol.NULL_PARAM_VALUE;
		}
		else {
			return encodeValue(context);
		}
	}

	/**
	 * Decode a previously encoded context Resource.
	 * 
	 * @param encodedValue
	 *        the encoded value
	 * @param valueFactory
	 *        the factory to use for constructing the Resource
	 * @return the decoded Resource, or null if the encoded values was null or equal to
	 *         {@link #NULL_PARAM_VALUE}
	 */
	public static Resource decodeContext(String encodedValue, ValueFactory valueFactory) {
		if (encodedValue == null) {
			return null;
		}
		else if (NULL_PARAM_VALUE.equals(encodedValue)) {
			return null;
		}
		else {
			return decodeResource(encodedValue, valueFactory);
		}
	}

	/**
	 * Encode context resources for use in a URL.
	 * 
	 * @param contexts
	 *        the contexts to encode, must not be null.
	 * @return the encoded contexts
	 * @throws IllegalArgumentException
	 *         If the contexts is null.
	 */
	public static String[] encodeContexts(Resource... contexts) {
		OpenRDFUtil.verifyContextNotNull(contexts);

		String[] result = new String[contexts.length];
		for (int index = 0; index < contexts.length; index++) {
			result[index] = encodeContext(contexts[index]);
		}

		return result;
	}

	/**
	 * Decode previously encoded contexts.
	 * 
	 * @param encodedValues
	 *        the encoded values
	 * @param valueFactory
	 *        the factory to use for constructing the Resources
	 * @return the decoded Resources, or an empty array if the supplied encodedValues was
	 *         null.
	 */
	public static Resource[] decodeContexts(String[] encodedValues, ValueFactory valueFactory) {
		Resource[] result;

		if (encodedValues == null) {
			result = new Resource[0];
		}
		else {
			result = new Resource[encodedValues.length];
			for (int index = 0; index < encodedValues.length; index++) {
				result[index] = decodeContext(encodedValues[index], valueFactory);
			}
		}

		return result;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy