/* * Copyright (C) 2005 Alfresco, Inc. * * Licensed under the Mozilla Public License version 1.1 * with a permitted attribution clause. You may obtain a * copy of the License at * * http://www.alfresco.org/legal/license.txt * * 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.alfresco.web.app.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.StringTokenizer; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.transaction.UserTransaction; import org.alfresco.config.Config; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.service.ServiceRegistry; import org.alfresco.web.app.Application; import org.alfresco.web.app.servlet.command.CommandFactory; import org.alfresco.web.app.servlet.command.CommandProcessor; import org.alfresco.web.config.CommandServletConfigElement; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Servlet responsible for executing commands upon node(s). *
* The URL to the servlet should be generated thus: *
/alfresco/command/processor-name/command-name/args/...*
* The 'processor-name' identifies the command processor to execute the command. For example the * 'workflow' processor will execute workflow commands upon a node (e.g. "approve" or "reject"). * For example: *
/alfresco/command/workflow/approve/workspace/SpacesStore/0000-0000-0000-0000 * The store protocol, followed by the store ID, followed by the content Node Id used to * identify the node to execute the workflow action upon. ** A 'return-page' URL argument can be specified as the redirect page to navigate too after processing. *
* Like most Alfresco servlets, the URL may be followed by a valid 'ticket' argument for authentication: * ?ticket=1234567890 *
* And/or also followed by the "?guest=true" argument to force guest access login for the URL. * * @author Kevin Roast */ public class CommandServlet extends BaseServlet { private static final long serialVersionUID = -5432407921038376133L; private static Log logger = LogFactory.getLog(CommandServlet.class); private static CommandFactory commandfactory = CommandFactory.getInstance(); public static final String ARG_RETURNPAGE = "return-page"; /** * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String uri = req.getRequestURI(); if (logger.isDebugEnabled()) logger.debug("Processing URL: " + uri + (req.getQueryString() != null ? ("?" + req.getQueryString()) : "")); AuthenticationStatus status = servletAuthenticate(req, res); if (status == AuthenticationStatus.Failure) { return; } StringTokenizer t = new StringTokenizer(uri, "/"); int tokenCount = t.countTokens(); if (tokenCount < 4) { throw new IllegalArgumentException("Command Servlet URL did not contain all required args: " + uri); } t.nextToken(); // skip web app name t.nextToken(); // skip servlet name // get the command processor to execute the command e.g. "workflow" String procName = t.nextToken(); // get the command to perform String command = t.nextToken(); // get any remaining uri elements to pass to the processor String[] args = new String[tokenCount - 4]; for (int i=0; i