/* * 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.handler; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.NodeTypeIterator; import javax.jcr.nodetype.NodeTypeManager; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.Response; import org.modeshape.common.util.CheckArg; import org.modeshape.web.jcr.rest.RestHelper; import org.modeshape.web.jcr.rest.model.RestNodeType; /** * Class which handles {@link NodeType} operations for incoming http requests on {@link org.modeshape.web.jcr.rest.ModeShapeRestService} * * @author Horia Chiorean (hchiorea@redhat.com) */ public final class RestNodeTypeHandler extends AbstractHandler { /** * HTTP response code for "Not Implemented" */ private static final int HTTP_NOT_IMPLEMENTED = 501; /** * Retrieves the {@link RestNodeType rest node type representation} of the {@link NodeType} with the given name. * * @param request a non-null {@link HttpServletRequest} * @param repositoryName a non-null, URL encoded {@link String} representing the name of a repository * @param workspaceName a non-null, URL encoded {@link String} representing the name of a workspace * @param nodeTypeName a non-null, URL encoded {@link String} representing the name of type * @return a {@link RestNodeType} instance. * @throws RepositoryException if any JCR related operation fails, including if the node type cannot be found. */ public RestNodeType getNodeType( HttpServletRequest request, String repositoryName, String workspaceName, String nodeTypeName ) throws RepositoryException { Session session = getSession(request, repositoryName, workspaceName); NodeTypeManager nodeTypeManager = session.getWorkspace().getNodeTypeManager(); NodeType nodeType = nodeTypeManager.getNodeType(nodeTypeName); return new RestNodeType(nodeType, RestHelper.repositoryUrl(request)); } /** * Imports a CND file into the repository, providing that the repository's {@link NodeTypeManager} is a valid ModeShape * node type manager. * * @param request a non-null {@link HttpServletRequest} * @param repositoryName a non-null, URL encoded {@link String} representing the name of a repository * @param workspaceName a non-null, URL encoded {@link String} representing the name of a workspace * @param allowUpdate a flag which indicates whether existing types should be updated or not. * @param cndInputStream a {@link InputStream} which is expected to be the input stream of a CND file. * @return a non-null {@link Response} instance * @throws RepositoryException if any JCR related operation fails */ public Response importCND( HttpServletRequest request, String repositoryName, String workspaceName, boolean allowUpdate, InputStream cndInputStream ) throws RepositoryException { CheckArg.isNotNull(cndInputStream, "request body"); Session session = getSession(request, repositoryName, workspaceName); NodeTypeManager nodeTypeManager = session.getWorkspace().getNodeTypeManager(); if (!(nodeTypeManager instanceof org.modeshape.jcr.api.nodetype.NodeTypeManager)) { //501 = not implemented return Response.status(Response.Status.fromStatusCode(HTTP_NOT_IMPLEMENTED)).build(); } org.modeshape.jcr.api.nodetype.NodeTypeManager modeshapeTypeManager = (org.modeshape.jcr.api.nodetype.NodeTypeManager)nodeTypeManager; try { List<RestNodeType> registeredTypes = registerCND(request, allowUpdate, cndInputStream, modeshapeTypeManager); return createOkResponse(registeredTypes); } catch (IOException e) { throw new RepositoryException(e); } } private Response createOkResponse( final List<RestNodeType> registeredTypes ) { GenericEntity<List<RestNodeType>> entity = new GenericEntity<List<RestNodeType>>(registeredTypes) { }; return Response.ok().entity(entity).build(); } private List<RestNodeType> registerCND( HttpServletRequest request, boolean allowUpdate, InputStream cndInputStream, org.modeshape.jcr.api.nodetype.NodeTypeManager modeshapeTypeManager ) throws IOException, RepositoryException { NodeTypeIterator nodeTypeIterator = modeshapeTypeManager.registerNodeTypes(cndInputStream, allowUpdate); List<RestNodeType> result = new ArrayList<RestNodeType>(); String baseUrl = RestHelper.repositoryUrl(request); while (nodeTypeIterator.hasNext()) { result.add(new RestNodeType(nodeTypeIterator.nextNodeType(), baseUrl)); } return result; } }