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

org.modeshape.web.jcr.rest.ModeShapeRestService Maven / Gradle / Ivy

There is a newer version: 5.4.1.Final
Show newest version
/*
 * ModeShape (http://www.modeshape.org)
 *
 * 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.modeshape.web.jcr.rest;

import java.io.File;
import java.io.InputStream;
import javax.jcr.Binary;
import javax.jcr.Property;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import javax.jcr.query.Query;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.codehaus.jettison.json.JSONException;
import org.jboss.resteasy.annotations.providers.multipart.MultipartForm;
import org.modeshape.common.annotation.Immutable;
import org.modeshape.common.util.StringUtil;
import org.modeshape.jcr.api.BackupOptions;
import org.modeshape.jcr.api.RestoreOptions;
import org.modeshape.web.jcr.rest.form.FileUploadForm;
import org.modeshape.web.jcr.rest.handler.RestBinaryHandler;
import org.modeshape.web.jcr.rest.handler.RestItemHandler;
import org.modeshape.web.jcr.rest.handler.RestNodeHandler;
import org.modeshape.web.jcr.rest.handler.RestNodeTypeHandler;
import org.modeshape.web.jcr.rest.handler.RestQueryHandler;
import org.modeshape.web.jcr.rest.handler.RestRepositoryHandler;
import org.modeshape.web.jcr.rest.handler.RestServerHandler;
import org.modeshape.web.jcr.rest.model.RestException;
import org.modeshape.web.jcr.rest.model.RestItem;
import org.modeshape.web.jcr.rest.model.RestNodeType;
import org.modeshape.web.jcr.rest.model.RestQueryPlanResult;
import org.modeshape.web.jcr.rest.model.RestQueryResult;
import org.modeshape.web.jcr.rest.model.RestRepositories;
import org.modeshape.web.jcr.rest.model.RestWorkspaces;

/**
 * RESTEasy handler to provide the JCR resources at the URIs below. Please note that these URIs assume a context of
 * {@code /resources} for the web application.
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
URI PatternDescriptionSupported Methods
/resourcesreturns a list of accessible repositoriesGET
/resources/{repositoryName}returns a list of accessible workspaces within that repositoryGET
/resources/{repositoryName}/{workspaceName}returns a list of operations within the workspaceGET
/resources/{repositoryName}/{workspaceName}/items/{path}accesses/creates/updates/deletes the item (node or property) at the path. For POST and PUT, the body of the request is * expected to be valid JSONGET, POST, PUT, DELETE
/resources/{repositoryName}/{workspaceName}/itemsperforms bulk create/update/delete of items. For POST, PUT and DELETE the body of the request is expected to be valid JSONPOST, PUT, DELETE
/resources/{repositoryName}/{workspaceName}/nodes/{id}accesses/updates/deletes the with the given identifier. For POST and PUT, the body of the request is expected to be valid * JSONGET, PUT, DELETE
/resources/{repositoryName}/{workspaceName}/binary/{path}accesses/creates/updates a binary property at the pathGET, POST, PUT. The binary data is expected to be written to the body of the request.
/resources/{repositoryName}/{workspaceName}/nodetypes/{name}accesses a node type from the repository, at the given nameGET
/resources/{repositoryName}/{workspaceName}/nodetypesimports a CND file into the repository. The binary content of the CND file is expected to be the body of the request.POST
/resources/{repositoryName}/{workspaceName}/queryexecutes the query in the body of the request with a language specified by the content type (application/jcr+xpath, * application/jcr+sql, application/jcr+sql2, or application/search)POST
*

Binary data

*

* When working with binary values, the /resources/{repositoryName}/{workspaceName}/binary/{path} method should be used. * When returning information involving binary values (either nodes with binary properties or binary properties directly), the * response will contain an URL which can be then called to retrieve the actual content of the binary value. *

* * @author Horia Chiorean ([email protected]) */ @Immutable @Path( "/" ) public final class ModeShapeRestService { private RestServerHandler serverHandler = new RestServerHandler(); private RestRepositoryHandler repositoryHandler = new RestRepositoryHandler(); private RestItemHandler itemHandler = new RestItemHandler(); private RestNodeHandler nodeHandler = new RestNodeHandler(); private RestQueryHandler queryHandler = new RestQueryHandler(); private RestBinaryHandler binaryHandler = new RestBinaryHandler(); private RestNodeTypeHandler nodeTypeHandler = new RestNodeTypeHandler(); /** * Returns the list of JCR repositories available on this server * * @param request the servlet request; may not be null * @return the list of JCR repositories available on this server, as a {@link RestRepositories} instance. */ @GET @Path( "/" ) @Produces( {MediaType.TEXT_HTML, MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON} ) public RestRepositories getRepositories( @Context HttpServletRequest request ) { return serverHandler.getRepositories(request); } /** * Returns the list of workspaces available to this user within the named repository. * * @param rawRepositoryName the name of the repository; may not be null * @param request the servlet request; may not be null * @return the list of workspaces available to this user within the named repository, as a {@link RestWorkspaces} instance. * @throws RepositoryException if there is any other error accessing the list of available workspaces for the repository */ @GET @Path( "{repositoryName}" ) @Produces( {MediaType.TEXT_HTML, MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON} ) public RestWorkspaces getWorkspaces( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName ) throws RepositoryException { return repositoryHandler.getWorkspaces(request, rawRepositoryName); } /** * Performs a repository backup on the server, allowing a list of custom parameters which can control the backup process. * The root location of the backup file on the server is the first accessible folder in the following order: * *
    *
  • the value of the servlet context 'backupLocation' parameter
  • *
  • the value of the system property 'jboss.domain.data.dir'
  • *
  • the value of the system property 'jboss.server.data.dir'
  • *
  • the value of the system property 'user.home'
  • *
* * If none of those locations is available and writable, the request will fail. * * @param servletContext the {@link ServletContext} instance * @param request a non-null {@link HttpServletRequest} request * @param repositoryName the name of the repository; may not be null * @param includeBinaries whether or not binary values should be part of the backup or not; defaults to {@code true} * @param documentsPerFile the number of nodes each backup file will contains; defaults to {@code 100k} * @param compress whether or not each documents file should be compressed or not; default to {@code true} * @return a {@link Response} instance which if successful will contain the name of the backup file and the location on the * server where the backup was performed. * @throws RepositoryException if there is any unexpected error while performing the backup * * @see org.modeshape.jcr.api.RepositoryManager#backupRepository(File, BackupOptions) */ @POST @Path( "{repositoryName}/" + RestHelper.BACKUP_METHOD_NAME ) @Produces( { MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public Response backup( @Context ServletContext servletContext, @Context HttpServletRequest request, @PathParam( "repositoryName" ) String repositoryName, @QueryParam( "includeBinaries" ) @DefaultValue( "true" ) final boolean includeBinaries, @QueryParam( "documentsPerFile" ) @DefaultValue( "100000" ) final long documentsPerFile, @QueryParam( "compress" ) @DefaultValue( "true" ) final boolean compress ) throws RepositoryException { return repositoryHandler.backupRepository(servletContext, request, repositoryName, new BackupOptions() { @Override public boolean includeBinaries() { return includeBinaries; } @Override public long documentsPerFile() { return documentsPerFile; } @Override public boolean compress() { return compress; } }); } /** * Performs a repository restore on the server based on the name of a backup provided as argument. * The root location where the backup will be searched is in order: * *
    *
  • the value of the servlet context 'backupLocation' parameter
  • *
  • the value of the system property 'jboss.domain.data.dir'
  • *
  • the value of the system property 'jboss.server.data.dir'
  • *
  • the value of the system property 'user.home'
  • *
* * If a backup with the given name cannot be found at any of those location, the request will fail. * * @param servletContext the {@link ServletContext} instance * @param request a non-null {@link HttpServletRequest} request * @param repositoryName the name of the repository; may not be null * @param backupName a {@link String} representing the name of the backup folder as returned by the backup request * @param includeBinaries whether or not binary values should be part of the backup or not; defaults to {@code true} * @param reindexContent whether or not a full repository reindexing should be performed, once restore has completed; defaults to {@code true} * @return a {@link Response} instance, never {@code null} * @throws RepositoryException if there is any unexpected error while performing the restore * * @see org.modeshape.jcr.api.RepositoryManager#restoreRepository(File, RestoreOptions) */ @POST @Path( "{repositoryName}/" + RestHelper.RESTORE_METHOD_NAME ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public Response restore(@Context ServletContext servletContext, @Context HttpServletRequest request, @PathParam( "repositoryName" ) String repositoryName, @QueryParam("name") final String backupName, @QueryParam( "includeBinaries" ) @DefaultValue( "true" ) final boolean includeBinaries, @QueryParam( "reindexContent" ) @DefaultValue( "true" ) final boolean reindexContent ) throws RepositoryException { return repositoryHandler.restoreRepository(servletContext, request, repositoryName, backupName, new RestoreOptions() { @Override public boolean reindexContentOnFinish() { return reindexContent; } @Override public boolean includeBinaries() { return includeBinaries; } }); } /** * Retrieves the binary content of the binary property at the given path, allowing 2 extra (optional) parameters: the * mime-type and the content-disposition of the binary value. * * @param request a non-null {@link HttpServletRequest} request * @param repositoryName a non-null {@link String} representing the name of a repository. * @param workspaceName a non-null {@link String} representing the name of a workspace. * @param path a non-null {@link String} representing the absolute path to a binary property. * @param mimeType an optional {@link String} representing the "already-known" mime-type of the binary. Can be {@code null} * @param contentDisposition an optional {@link String} representing the client-preferred content disposition of the respose. * Can be {@code null} * @return the binary stream of the requested binary property or NOT_FOUND if either the property isn't found or it isn't a * binary * @throws RepositoryException if any JCR related operation fails, including the case when the path to the property isn't * valid. */ @GET @Path( "{repositoryName}/{workspaceName}/" + RestHelper.BINARY_METHOD_NAME + "{path:.+}" ) @Produces( {MediaType.TEXT_HTML, MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON} ) public Response getBinary( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String repositoryName, @PathParam( "workspaceName" ) String workspaceName, @PathParam( "path" ) String path, @QueryParam( "mimeType" ) String mimeType, @QueryParam( "contentDisposition" ) String contentDisposition ) throws RepositoryException { Property binaryProperty = binaryHandler.getBinaryProperty(request, repositoryName, workspaceName, path); if (binaryProperty.getType() != PropertyType.BINARY) { return Response.status(Response.Status.NOT_FOUND) .entity(new RestException("The property " + binaryProperty.getPath() + " is not a binary")).build(); } Binary binary = binaryProperty.getBinary(); if (StringUtil.isBlank(mimeType)) { mimeType = binaryHandler.getDefaultMimeType(binaryProperty); } if (StringUtil.isBlank(contentDisposition)) { contentDisposition = binaryHandler.getDefaultContentDisposition(binaryProperty); } return Response.ok(binary.getStream(), mimeType).header("Content-Disposition", contentDisposition).build(); } /** * Retrieves the node type definition with the given name from the repository. * * @param request a non-null {@link HttpServletRequest} request * @param repositoryName a non-null {@link String} representing the name of a repository. * @param workspaceName a non-null {@link String} representing the name of a workspace. * @param nodeTypeName a non-null {@link String} representing the name of a node type. * @return the node type information. * @throws RepositoryException if any JCR related operation fails. */ @GET @Path( "{repositoryName}/{workspaceName}/" + RestHelper.NODE_TYPES_METHOD_NAME + "/{nodeTypeName:.+}" ) @Produces( {MediaType.TEXT_HTML, MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON} ) public RestNodeType getNodeType( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String repositoryName, @PathParam( "workspaceName" ) String workspaceName, @PathParam( "nodeTypeName" ) String nodeTypeName ) throws RepositoryException { return nodeTypeHandler.getNodeType(request, repositoryName, workspaceName, nodeTypeName); } /** * Imports a single CND file into the repository. The CND file should be submitted as the body of the request. * * @param request a non-null {@link HttpServletRequest} request * @param repositoryName a non-null {@link String} representing the name of a repository. * @param workspaceName a non-null {@link String} representing the name of a workspace. * @param allowUpdate an optional parameter which indicates whether existing node types should be updated (overridden) or not. * @param requestBodyInputStream a {@code non-null} {@link InputStream} instance, representing the body of the request. * @return a list with the registered node types if the operation was successful, or an appropriate error code otherwise. * @throws RepositoryException if any JCR related operation fails. */ @POST @Path( "{repositoryName}/{workspaceName}/" + RestHelper.NODE_TYPES_METHOD_NAME ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public Response postCND( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String repositoryName, @PathParam( "workspaceName" ) String workspaceName, @QueryParam( "allowUpdate" ) @DefaultValue( "true" ) boolean allowUpdate, InputStream requestBodyInputStream ) throws RepositoryException { return nodeTypeHandler.importCND(request, repositoryName, workspaceName, allowUpdate, requestBodyInputStream); } /** * Imports a single CND file into the repository, using a {@link MediaType#MULTIPART_FORM_DATA} request. The CND file is * expected to be submitted from an HTML element with the name file * * @param request a non-null {@link HttpServletRequest} request * @param repositoryName a non-null {@link String} representing the name of a repository. * @param workspaceName a non-null {@link String} representing the name of a workspace. * @param allowUpdate an optional parameter which indicates whether existing node types should be updated (overridden) or not. * @param form a {@link FileUploadForm} instance representing the HTML form from which the cnd was submitted * @return a {@code non-null} {@link Response} * @throws RepositoryException if any JCR operations fail * @throws IllegalArgumentException if the submitted form does not contain an HTML element named "file". */ @POST @Path( "{repositoryName}/{workspaceName}/" + RestHelper.NODE_TYPES_METHOD_NAME ) @Produces( {MediaType.TEXT_HTML, MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN} ) @Consumes( MediaType.MULTIPART_FORM_DATA ) public Response postCNDViaForm( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String repositoryName, @PathParam( "workspaceName" ) String workspaceName, @QueryParam( "allowUpdate" ) @DefaultValue( "true" ) boolean allowUpdate, @MultipartForm FileUploadForm form ) throws RepositoryException { form.validate(); return nodeTypeHandler.importCND(request, repositoryName, workspaceName, allowUpdate, form.getFileData()); } /** * Retrieves an item from a workspace * * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param path the path to the item * @param depth the depth of the node graph that should be returned if {@code path} refers to a node. @{code 0} means return * the requested node only. A negative value indicates that the full subgraph under the node should be returned. This * parameter defaults to {@code 0} and is ignored if {@code path} refers to a property. * @return a {@code non-null} {@link RestItem} * @throws RepositoryException if any JCR error occurs * @see javax.jcr.Session#getItem(String) */ @GET @Path( "{repositoryName}/{workspaceName}/" + RestHelper.ITEMS_METHOD_NAME + "{path:.*}" ) @Produces( {MediaType.TEXT_HTML, MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON} ) public RestItem getItem( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @PathParam( "path" ) String path, @QueryParam( "depth" ) @DefaultValue( "0" ) int depth ) throws RepositoryException { return itemHandler.item(request, rawRepositoryName, rawWorkspaceName, path, depth); } /** * Adds the content of the request as a node (or subtree of nodes) at the location specified by {@code path}. *

* The primary type and mixin type(s) may optionally be specified through the {@code jcr:primaryType} and * {@code jcr:mixinTypes} properties as request attributes. *

* * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param path the path to the item * @param requestContent the JSON-encoded representation of the node or nodes to be added * @return a {@code non-null} {@link Response} instance which either contains the node or an error code. * @throws JSONException if there is an error reading the request body as a valid JSON object. * @throws RepositoryException if any other error occurs */ @POST @Consumes( MediaType.APPLICATION_JSON ) @Path( "{repositoryName}/{workspaceName}/" + RestHelper.ITEMS_METHOD_NAME + "{path:.+}" ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN, MediaType.TEXT_HTML} ) public Response postItem( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @PathParam( "path" ) String path, String requestContent ) throws RepositoryException, JSONException { return itemHandler.addItem(request, rawRepositoryName, rawWorkspaceName, path, requestContent); } /** * Performs a bulk creation of items via a single session, using the body of the request, which is expected to be a valid JSON * object. The format of the JSON request must be an object of the form: *
    *
  • { "node1_path" : { node1_body }, "node2_path": { node2_body } ... }
  • *
  • { "property1_path" : { property1_body }, "property2_path": { property2_body } ... }
  • *
  • { "property1_path" : { property1_body }, "node1_path": { node1_body } ... }
  • *
* where each body (either of a property or of a node) is expected to be a JSON object which has the same format as the one * used when creating a single item. * * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param requestContent the JSON-encoded representation of the node or nodes to be added * @return a {@code non-null} {@link Response} instance which either contains the item or an error code. * @throws JSONException if there is an error reading the request body as a valid JSON object. * @throws RepositoryException if any other error occurs * @see ModeShapeRestService#postItem(javax.servlet.http.HttpServletRequest, String, String, String, String) */ @POST @Consumes( MediaType.APPLICATION_JSON ) @Path( "{repositoryName}/{workspaceName}/" + RestHelper.ITEMS_METHOD_NAME ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN, MediaType.TEXT_HTML} ) public Response postItems( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, String requestContent ) throws RepositoryException, JSONException { return itemHandler.addItems(request, rawRepositoryName, rawWorkspaceName, requestContent); } /** * Deletes the item at {@code path}. * * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param path the path to the item * @return a {@code non-null} {@link Response} instance. * @throws RepositoryException if any other error occurs */ @DELETE @Path( "{repositoryName}/{workspaceName}/" + RestHelper.ITEMS_METHOD_NAME + "{path:.+}" ) public Response deleteItem( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @PathParam( "path" ) String path ) throws RepositoryException { itemHandler.deleteItem(request, rawRepositoryName, rawWorkspaceName, path); return Response.noContent().build(); } /** * Performs a bulk deletion of nodes via a single session, using the body of the request, which is expected to be a valid JSON * array. The format of the JSON request must an array of the form: *
    *
  • ["node1_path", "node2_path",...]
  • *
  • ["property1_path", "property2_path",...]
  • *
  • ["property1_path", "node1_path",...]
  • *
* * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param requestContent the JSON-encoded representation of the node or nodes to be added * @return a {@code non-null} {@link Response} instance. * @throws JSONException if there is an error reading the request body as a valid JSON object. * @throws RepositoryException if any other error occurs * @see ModeShapeRestService#deleteItem(javax.servlet.http.HttpServletRequest, String, String, String) */ @DELETE @Consumes( MediaType.APPLICATION_JSON ) @Path( "{repositoryName}/{workspaceName}/" + RestHelper.ITEMS_METHOD_NAME ) public Response deleteItems( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, String requestContent ) throws RepositoryException, JSONException { return itemHandler.deleteItems(request, rawRepositoryName, rawWorkspaceName, requestContent); } /** * Updates the node or property at the path. *

* If path points to a property, this method expects the request content to be either a JSON array or a JSON string. The array * or string will become the values or value of the property. If path points to a node, this method expects the request * content to be a JSON object. The keys of the objects correspond to property names that will be set and the values for the * keys correspond to the values that will be set on the properties. *

* * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param path the path to the item * @param requestContent the JSON-encoded representation of the values and, possibly, properties to be set * @return a {@link RestItem} instance representing the modified item. * @throws JSONException if there is an error reading the request body as a valid JSON object. * @throws RepositoryException if any other error occurs */ @PUT @Path( "{repositoryName}/{workspaceName}/" + RestHelper.ITEMS_METHOD_NAME + "{path:.+}" ) @Consumes( MediaType.APPLICATION_JSON ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public RestItem putItem( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @PathParam( "path" ) String path, String requestContent ) throws JSONException, RepositoryException { return itemHandler.updateItem(request, rawRepositoryName, rawWorkspaceName, path, requestContent); } /** * Performs a bulk update of items via a single session, using the body of the request, which is expected to be a valid JSON * object. The format of the JSON request must be an object of the form: *
    *
  • { "node1_path" : { node1_body }, "node2_path": { node2_body } ... }
  • *
  • { "property1_path" : { property1_body }, "property2_path": { property2_body } ... }
  • *
  • { "property1_path" : { property1_body }, "node1_path": { node1_body } ... }
  • *
* where each body (either of a property or of a node) is expected to be a JSON object which has the same format as the one * used when updating a single item. * * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param requestContent the JSON-encoded representation of the values and, possibly, properties to be set * @return a {@code non-null} {@link Response} * @throws JSONException if there is an error reading the request body as a valid JSON object. * @throws RepositoryException if any other error occurs * @see ModeShapeRestService#putItem(javax.servlet.http.HttpServletRequest, String, String, String, String) */ @PUT @Path( "{repositoryName}/{workspaceName}/" + RestHelper.ITEMS_METHOD_NAME ) @Consumes( MediaType.APPLICATION_JSON ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public Response putItems( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, String requestContent ) throws JSONException, RepositoryException { return itemHandler.updateItems(request, rawRepositoryName, rawWorkspaceName, requestContent); } /** * Creates or updates a binary property in the repository, at the given path. The binary content is expected to be written * directly to the request body. * * @param request a non-null {@link HttpServletRequest} request * @param repositoryName a non-null {@link String} representing the name of a repository. * @param workspaceName a non-null {@link String} representing the name of a workspace. * @param path a non-null {@link String} representing the absolute path to a binary property. * @param requestBodyInputStream a non-null {@link InputStream} stream which represents the body of the request, where the * binary content is expected. * @return a representation of the binary property that was created/updated. * @throws RepositoryException if any JCR related operation fails. */ @POST @Path( "{repositoryName}/{workspaceName}/" + RestHelper.BINARY_METHOD_NAME + "{path:.+}" ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public Response postBinary( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String repositoryName, @PathParam( "workspaceName" ) String workspaceName, @PathParam( "path" ) String path, InputStream requestBodyInputStream ) throws RepositoryException { return binaryHandler.updateBinary(request, repositoryName, workspaceName, path, requestBodyInputStream, true); } /** * Updates a binary property in the repository, at the given path. If the binary property does not exist, the NOT_FOUND http * response code is returned. The binary content is expected to be written directly to the request body. * * @param request a non-null {@link HttpServletRequest} request * @param repositoryName a non-null {@link String} representing the name of a repository. * @param workspaceName a non-null {@link String} representing the name of a workspace. * @param path a non-null {@link String} representing the absolute path to an existing binary property. * @param requestBodyInputStream a non-null {@link InputStream} stream which represents the body of the request, where the * binary content is expected. * @return a representation of the binary property that was updated. * @throws RepositoryException if any JCR related operation fails. */ @PUT @Path( "{repositoryName}/{workspaceName}/" + RestHelper.BINARY_METHOD_NAME + "{path:.+}" ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public Response putBinary( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String repositoryName, @PathParam( "workspaceName" ) String workspaceName, @PathParam( "path" ) String path, InputStream requestBodyInputStream ) throws RepositoryException { return binaryHandler.updateBinary(request, repositoryName, workspaceName, path, requestBodyInputStream, false); } /** * Creates/updates a binary file into the repository, using a {@link MediaType#MULTIPART_FORM_DATA} request, at {@code path}. * The binary file is expected to be submitted from an HTML element with the name file * * @param request a non-null {@link HttpServletRequest} request * @param repositoryName a non-null {@link String} representing the name of a repository. * @param workspaceName a non-null {@link String} representing the name of a workspace. * @param path the path to the binary property * @param form a {@link FileUploadForm} instance representing the HTML form from which the binary was submitted * @return a {@code non-null} {@link Response} * @throws RepositoryException if any JCR related operation fails. * @see ModeShapeRestService#postBinary(javax.servlet.http.HttpServletRequest, String, String, String, java.io.InputStream) */ @POST @Path( "{repositoryName}/{workspaceName}/" + RestHelper.BINARY_METHOD_NAME + "{path:.+}" ) @Produces( {MediaType.TEXT_HTML, MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN} ) @Consumes( MediaType.MULTIPART_FORM_DATA ) public Response postBinaryViaForm( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String repositoryName, @PathParam( "workspaceName" ) String workspaceName, @PathParam( "path" ) String path, @MultipartForm FileUploadForm form ) throws RepositoryException { form.validate(); return binaryHandler.updateBinary(request, repositoryName, workspaceName, path, form.getFileData(), true); } /** * Creates/updates a binary file into the repository, using a {@link MediaType#MULTIPART_FORM_DATA} request, at {@code path}. * The binary content is expected to be submitted from an HTML element with the name file. *

* Depending on the whether any node exists or not at {@code path}, this method behaves in different ways: *

    *
  • If {@code path} exists on the server, it is expected to point to an existing [nt:file] node, for which the * [jcr:content]/[jcr:data] property will be updated/set
  • *
  • If {@code path} doesn't exist or only a subpath exists on the server, then for each missing segment but the last * an [nt:folder] node will be created. The last segment of the path will always represent the name of the [nt:file] node * which will be created together with its content: [jcr:content]/[jcr:data].
  • *
* For example: issuing a POST request via this method to a path at which no node exists - {@code node1/node2/node3} - will * trigger the creation of the corresponding nodes with the types - * {@code [nt:folder]/[nt:folder]/[nt:file]/[jcr:content]/[jcr:data]} *

* * @param request a non-null {@link HttpServletRequest} request * @param repositoryName a non-null {@link String} representing the name of a repository. * @param workspaceName a non-null {@link String} representing the name of a workspace. * @param filePath the path to the binary property * @param form a {@link FileUploadForm} instance representing the HTML form from which the binary was submitted * @return a {@code non-null} {@link Response} * @throws RepositoryException if any JCR related operation fails. */ @POST @Path( "{repositoryName}/{workspaceName}/" + RestHelper.UPLOAD_METHOD_NAME + "{path:.+}" ) @Produces( {MediaType.TEXT_HTML, MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN} ) @Consumes( MediaType.MULTIPART_FORM_DATA ) public Response uploadBinaryViaForm( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String repositoryName, @PathParam( "workspaceName" ) String workspaceName, @PathParam( "path" ) String filePath, @MultipartForm FileUploadForm form ) throws RepositoryException { form.validate(); return binaryHandler.uploadBinary(request, repositoryName, workspaceName, filePath, form.getFileData()); } /** * Creates/updates a binary file into the repository, using the body of the request as the contents of the binary file, * at {@code path}. *

* Depending on the whether any node exists or not at {@code path}, this method behaves in different ways: *

    *
  • If {@code path} exists on the server, it is expected to point to an existing [nt:file] node, for which the * [jcr:content]/[jcr:data] property will be updated/set
  • *
  • If {@code path} doesn't exist or only a subpath exists on the server, then for each missing segment but the last * an [nt:folder] node will be created. The last segment of the path will always represent the name of the [nt:file] node * which will be created together with its content: [jcr:content]/[jcr:data].
  • *
* For example: issuing a POST request via this method to a path at which no node exists - {@code node1/node2/node3} - will * trigger the creation of the corresponding nodes with the types - * {@code [nt:folder]/[nt:folder]/[nt:file]/[jcr:content]/[jcr:data]} *

* * @param request a non-null {@link HttpServletRequest} request * @param repositoryName a non-null {@link String} representing the name of a repository. * @param workspaceName a non-null {@link String} representing the name of a workspace. * @param filePath the path to the binary property * @param requestBodyInputStream a non-null {@link InputStream} stream which represents the body of the request, where the * binary content is expected. * @return a {@code non-null} {@link Response} * @throws RepositoryException if any JCR related operation fails. */ @POST @Path( "{repositoryName}/{workspaceName}/" + RestHelper.UPLOAD_METHOD_NAME + "{path:.+}" ) @Produces( {MediaType.TEXT_HTML, MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN} ) public Response uploadBinary( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String repositoryName, @PathParam( "workspaceName" ) String workspaceName, @PathParam( "path" ) String filePath, InputStream requestBodyInputStream ) throws RepositoryException { return binaryHandler.uploadBinary(request, repositoryName, workspaceName, filePath, requestBodyInputStream); } /** * Executes the XPath query contained in the body of the request against the give repository and workspace. * * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param offset the offset to the first row to be returned. If this value is greater than the size of the result set, no * records will be returned. If this value is less than 0, results will be returned starting from the first record in * the result set. * @param limit the maximum number of rows to be returned. If this value is greater than the size of the result set, the * entire result set will be returned. If this value is less than zero, the entire result set will be returned. The * results are counted from the record specified in the offset parameter. * @param uriInfo the information about the URI (from which the other query parameters will be obtained) * @param requestContent the query expression * @return a {@code non-null} {@link RestQueryResult} instance. * @throws RepositoryException if any JCR error occurs */ @SuppressWarnings( "deprecation" ) @POST @Path( "{repositoryName}/{workspaceName}/query" ) @Consumes( "application/jcr+xpath" ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public RestQueryResult postXPathQuery( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @QueryParam( "offset" ) @DefaultValue( "-1" ) long offset, @QueryParam( "limit" ) @DefaultValue( "-1" ) long limit, @Context UriInfo uriInfo, String requestContent ) throws RepositoryException { return queryHandler.executeQuery(request, rawRepositoryName, rawWorkspaceName, Query.XPATH, requestContent, offset, limit, uriInfo); } /** * Executes the JCR-SQL query contained in the body of the request against the give repository and workspace. *

* The query results will be JSON-encoded in the response body. *

* * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param offset the offset to the first row to be returned. If this value is greater than the size of the result set, no * records will be returned. If this value is less than 0, results will be returned starting from the first record in * the result set. * @param limit the maximum number of rows to be returned. If this value is greater than the size of the result set, the * entire result set will be returned. If this value is less than zero, the entire result set will be returned. The * results are counted from the record specified in the offset parameter. * @param uriInfo the information about the URI (from which the other query parameters will be obtained) * @param requestContent the query expression * @return a {@code non-null} {@link RestQueryResult} instance. * @throws RepositoryException if any JCR error occurs */ @SuppressWarnings( "deprecation" ) @POST @Path( "{repositoryName}/{workspaceName}/query" ) @Consumes( "application/jcr+sql" ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public RestQueryResult postJcrSqlQuery( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @QueryParam( "offset" ) @DefaultValue( "-1" ) long offset, @QueryParam( "limit" ) @DefaultValue( "-1" ) long limit, @Context UriInfo uriInfo, String requestContent ) throws RepositoryException { return queryHandler.executeQuery(request, rawRepositoryName, rawWorkspaceName, Query.SQL, requestContent, offset, limit, uriInfo); } /** * Executes the JCR-SQL2 query contained in the body of the request against the give repository and workspace. *

* The query results will be JSON-encoded in the response body. *

* * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param offset the offset to the first row to be returned. If this value is greater than the size of the result set, no * records will be returned. If this value is less than 0, results will be returned starting from the first record in * the result set. * @param limit the maximum number of rows to be returned. If this value is greater than the size of the result set, the * entire result set will be returned. If this value is less than zero, the entire result set will be returned. The * results are counted from the record specified in the offset parameter. * @param uriInfo the information about the URI (from which the other query parameters will be obtained) * @param requestContent the query expression * @return a {@code non-null} {@link RestQueryResult} instance. * @throws RepositoryException if any JCR error occurs */ @POST @Path( "{repositoryName}/{workspaceName}/query" ) @Consumes( "application/jcr+sql2" ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public RestQueryResult postJcrSql2Query( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @QueryParam( "offset" ) @DefaultValue( "-1" ) long offset, @QueryParam( "limit" ) @DefaultValue( "-1" ) long limit, @Context UriInfo uriInfo, String requestContent ) throws RepositoryException { return queryHandler.executeQuery(request, rawRepositoryName, rawWorkspaceName, Query.JCR_SQL2, requestContent, offset, limit, uriInfo); } /** * Executes the JCR-SQL query contained in the body of the request against the give repository and workspace. *

* The query results will be JSON-encoded in the response body. *

* * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param offset the offset to the first row to be returned. If this value is greater than the size of the result set, no * records will be returned. If this value is less than 0, results will be returned starting from the first record in * the result set. * @param limit the maximum number of rows to be returned. If this value is greater than the size of the result set, the * entire result set will be returned. If this value is less than zero, the entire result set will be returned. The * results are counted from the record specified in the offset parameter. * @param uriInfo the information about the URI (from which the other query parameters will be obtained) * @param requestContent the query expression * @return a {@code non-null} {@link RestQueryResult} instance. * @throws RepositoryException if any JCR error occurs */ @POST @Path( "{repositoryName}/{workspaceName}/query" ) @Consumes( "application/jcr+search" ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public RestQueryResult postJcrSearchQuery( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @QueryParam( "offset" ) @DefaultValue( "-1" ) long offset, @QueryParam( "limit" ) @DefaultValue( "-1" ) long limit, @Context UriInfo uriInfo, String requestContent ) throws RepositoryException { return queryHandler.executeQuery(request, rawRepositoryName, rawWorkspaceName, org.modeshape.jcr.api.query.Query.FULL_TEXT_SEARCH, requestContent, offset, limit, uriInfo); } /** * Executes the XPath query contained in the body of the request against the give repository and workspace. *

* The string representation of the query plan will be returned in the response body. *

* * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param offset the offset to the first row to be returned. If this value is greater than the size of the result set, no * records will be returned. If this value is less than 0, results will be returned starting from the first record in * the result set. * @param limit the maximum number of rows to be returned. If this value is greater than the size of the result set, the * entire result set will be returned. If this value is less than zero, the entire result set will be returned. The * results are counted from the record specified in the offset parameter. * @param uriInfo the information about the URI (from which the other query parameters will be obtained) * @param requestContent the query expression * @return a {@code non-null} response containing a string representation of the query plan * @throws RepositoryException if any JCR error occurs */ @SuppressWarnings( "deprecation" ) @POST @Path( "{repositoryName}/{workspaceName}/queryPlan" ) @Consumes( "application/jcr+xpath" ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public RestQueryPlanResult postXPathQueryPlan( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @QueryParam( "offset" ) @DefaultValue( "-1" ) long offset, @QueryParam( "limit" ) @DefaultValue( "-1" ) long limit, @Context UriInfo uriInfo, String requestContent ) throws RepositoryException { return queryHandler.planQuery(request, rawRepositoryName, rawWorkspaceName, Query.XPATH, requestContent, offset, limit, uriInfo); } /** * Executes the JCR-SQL query contained in the body of the request against the give repository and workspace. *

* The string representation of the query plan will be returned in the response body. *

* * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param offset the offset to the first row to be returned. If this value is greater than the size of the result set, no * records will be returned. If this value is less than 0, results will be returned starting from the first record in * the result set. * @param limit the maximum number of rows to be returned. If this value is greater than the size of the result set, the * entire result set will be returned. If this value is less than zero, the entire result set will be returned. The * results are counted from the record specified in the offset parameter. * @param uriInfo the information about the URI (from which the other query parameters will be obtained) * @param requestContent the query expression * @return a {@code non-null} response containing a string representation of the query plan * @throws RepositoryException if any JCR error occurs */ @SuppressWarnings( "deprecation" ) @POST @Path( "{repositoryName}/{workspaceName}/queryPlan" ) @Consumes( "application/jcr+sql" ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public RestQueryPlanResult postJcrSqlQueryPlan( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @QueryParam( "offset" ) @DefaultValue( "-1" ) long offset, @QueryParam( "limit" ) @DefaultValue( "-1" ) long limit, @Context UriInfo uriInfo, String requestContent ) throws RepositoryException { return queryHandler.planQuery(request, rawRepositoryName, rawWorkspaceName, Query.SQL, requestContent, offset, limit, uriInfo); } /** * Executes the JCR-SQL2 query contained in the body of the request against the give repository and workspace. *

* The string representation of the query plan will be returned in the response body. *

* * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param offset the offset to the first row to be returned. If this value is greater than the size of the result set, no * records will be returned. If this value is less than 0, results will be returned starting from the first record in * the result set. * @param limit the maximum number of rows to be returned. If this value is greater than the size of the result set, the * entire result set will be returned. If this value is less than zero, the entire result set will be returned. The * results are counted from the record specified in the offset parameter. * @param uriInfo the information about the URI (from which the other query parameters will be obtained) * @param requestContent the query expression * @return a {@code non-null} response containing a string representation of the query plan * @throws RepositoryException if any JCR error occurs */ @POST @Path( "{repositoryName}/{workspaceName}/queryPlan" ) @Consumes( "application/jcr+sql2" ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public RestQueryPlanResult postJcrSql2QueryPlan( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @QueryParam( "offset" ) @DefaultValue( "-1" ) long offset, @QueryParam( "limit" ) @DefaultValue( "-1" ) long limit, @Context UriInfo uriInfo, String requestContent ) throws RepositoryException { return queryHandler.planQuery(request, rawRepositoryName, rawWorkspaceName, Query.JCR_SQL2, requestContent, offset, limit, uriInfo); } /** * Compute the plan for the JCR-SQL query contained in the body of the request against the give repository and workspace. *

* The string representation of the query plan will be returned in the response body. *

* * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param offset the offset to the first row to be returned. If this value is greater than the size of the result set, no * records will be returned. If this value is less than 0, results will be returned starting from the first record in * the result set. * @param limit the maximum number of rows to be returned. If this value is greater than the size of the result set, the * entire result set will be returned. If this value is less than zero, the entire result set will be returned. The * results are counted from the record specified in the offset parameter. * @param uriInfo the information about the URI (from which the other query parameters will be obtained) * @param requestContent the query expression * @return a {@code non-null} response containing a string representation of the query plan * @throws RepositoryException if any JCR error occurs */ @POST @Path( "{repositoryName}/{workspaceName}/queryPlan" ) @Consumes( "application/jcr+search" ) @Produces( {MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON, MediaType.TEXT_HTML} ) public RestQueryPlanResult postJcrSearchQueryPlan( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @QueryParam( "offset" ) @DefaultValue( "-1" ) long offset, @QueryParam( "limit" ) @DefaultValue( "-1" ) long limit, @Context UriInfo uriInfo, String requestContent ) throws RepositoryException { return queryHandler.planQuery(request, rawRepositoryName, rawWorkspaceName, org.modeshape.jcr.api.query.Query.FULL_TEXT_SEARCH, requestContent, offset, limit, uriInfo); } /** * Retrieves from a workspace the node with the specified identifier. * * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param id the node identifier of the existing item * @param depth the depth of the node graph that should be returned. @{code 0} means return the requested node only. A * negative value indicates that the full subgraph under the node should be returned. This parameter defaults to * {@code 0}. * @return a {@code non-null} {@link RestItem} * @throws RepositoryException if any JCR error occurs * @see javax.jcr.Session#getNodeByIdentifier(String) */ @GET @Path( "{repositoryName}/{workspaceName}/" + RestHelper.NODES_METHOD_NAME + "/{id:.*}" ) @Produces( {MediaType.TEXT_HTML, MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON} ) public RestItem getNodeWithId( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @PathParam( "id" ) String id, @QueryParam( "depth" ) @DefaultValue( "0" ) int depth ) throws RepositoryException { return nodeHandler.nodeWithId(request, rawRepositoryName, rawWorkspaceName, id, depth); } /** * Updates the node with the given identifier *

* This method expects the request content to be a JSON object. The keys of the objects correspond to property names that will * be set and the values for the keys correspond to the values that will be set on the properties. *

* * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param id the node identifier of the existing item * @param requestContent the JSON-encoded representation of the values and, possibly, properties to be set * @return a {@link RestItem} instance representing the modified item. * @throws JSONException if there is an error reading the request body as a valid JSON object. * @throws RepositoryException if any other error occurs */ @PUT @Path( "{repositoryName}/{workspaceName}/" + RestHelper.NODES_METHOD_NAME + "/{id:.+}" ) @Consumes( MediaType.APPLICATION_JSON ) @Produces( {MediaType.APPLICATION_JSON, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN} ) public RestItem putNodeWithId( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @PathParam( "id" ) String id, String requestContent ) throws JSONException, RepositoryException { return nodeHandler.updateNodeWithId(request, rawRepositoryName, rawWorkspaceName, id, requestContent); } /** * Deletes the subgraph at the node with the given identifier. * * @param request the servlet request; may not be null or unauthenticated * @param rawRepositoryName the URL-encoded repository name * @param rawWorkspaceName the URL-encoded workspace name * @param id the node identifier of the existing item * @return a {@code non-null} {@link Response} instance. * @throws RepositoryException if any other error occurs */ @DELETE @Path( "{repositoryName}/{workspaceName}/" + RestHelper.NODES_METHOD_NAME + "/{id:.+}" ) public Response deleteNodeWithId( @Context HttpServletRequest request, @PathParam( "repositoryName" ) String rawRepositoryName, @PathParam( "workspaceName" ) String rawWorkspaceName, @PathParam( "id" ) String id ) throws RepositoryException { nodeHandler.deleteNodeWithId(request, rawRepositoryName, rawWorkspaceName, id); return Response.noContent().build(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy