From 4fc5704b6233d378ec1d376d1a2186efb95f8e8d Mon Sep 17 00:00:00 2001 From: David Caruana Date: Wed, 9 Aug 2006 23:37:06 +0000 Subject: [PATCH] Workflow Checkpoint: - Process deploy/isDeployed/undeploy implemented in Workflow Service - Servlet implemented to support jBPM Process Designer deployment (using above service) : mapped to /alfresco/jbpm/deployprocess URL - Workflow deployer bootstrap bean (for once- only loading of process definitions at bootstrap) - Initial cut of Review & Approve process definition & Task definitions (bootstrapped) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@3477 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../app/servlet/JBPMDeployProcessServlet.java | 145 ++++++++++++++++++ .../jbpm/webapp/servlet/DeployServlet.java | 68 -------- .../jbpm/webapp/servlet/UploadServlet.java | 119 -------------- source/web/WEB-INF/web.xml | 35 ++--- 4 files changed, 156 insertions(+), 211 deletions(-) create mode 100644 source/java/org/alfresco/web/app/servlet/JBPMDeployProcessServlet.java delete mode 100644 source/java/org/jbpm/webapp/servlet/DeployServlet.java delete mode 100644 source/java/org/jbpm/webapp/servlet/UploadServlet.java diff --git a/source/java/org/alfresco/web/app/servlet/JBPMDeployProcessServlet.java b/source/java/org/alfresco/web/app/servlet/JBPMDeployProcessServlet.java new file mode 100644 index 0000000000..e2dcc6b62b --- /dev/null +++ b/source/java/org/alfresco/web/app/servlet/JBPMDeployProcessServlet.java @@ -0,0 +1,145 @@ +/* + * 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.InputStream; +import java.util.Iterator; +import java.util.List; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.repo.workflow.WorkflowDefinitionComponent; +import org.alfresco.service.cmr.workflow.WorkflowDefinition; +import org.alfresco.service.cmr.workflow.WorkflowException; +import org.apache.commons.fileupload.DiskFileUpload; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUpload; +import org.apache.commons.fileupload.FileUploadException; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + + +/** + * Servlet for handling process deployments from jBPM process designer. + * + * @author davidc + */ +public class JBPMDeployProcessServlet extends HttpServlet +{ + private static final long serialVersionUID = 8002539291245090187L; + + + /* (non-Javadoc) + * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + public void service(HttpServletRequest request, HttpServletResponse response) + throws IOException + { + try + { + response.setContentType("text/html"); + InputStream deploymentArchive = getDeploymentArchive(request); + WorkflowDefinition workflowDef = deployArchive(deploymentArchive); + response.getWriter().println("Deployed archive " + workflowDef.name + " successfully"); + } + catch(IOException e) + { + // NOTE: according to original jBPM deployment servlet + response.getWriter().println("IOException"); + } + catch(FileUploadException e) + { + // NOTE: according to original jBPM deployment servlet + response.getWriter().println("FileUploadException"); + } + } + + + /** + * Retrieve the JBPM Process Designer deployment archive from the request + * + * @param request the request + * @return the input stream onto the deployment archive + * @throws WorkflowException + * @throws FileUploadException + * @throws IOException + */ + private InputStream getDeploymentArchive(HttpServletRequest request) + throws FileUploadException, IOException + { + if (!FileUpload.isMultipartContent(request)) + { + throw new FileUploadException("Not a multipart request"); + } + + GPDUpload fileUpload = new GPDUpload(); + List list = fileUpload.parseRequest(request); + Iterator iterator = list.iterator(); + if (!iterator.hasNext()) + { + throw new FileUploadException("No process file in the request"); + } + + FileItem fileItem = (FileItem) iterator.next(); + if (fileItem.getContentType().indexOf("application/x-zip-compressed") == -1) + { + throw new FileUploadException("Not a process archive"); + } + + return fileItem.getInputStream(); + } + + + /** + * Deploy the jBPM process archive to the Alfresco Repository + * + * @param deploymentArchive the archive to deploy + * @return the deployed workflow definition + */ + private WorkflowDefinition deployArchive(InputStream deploymentArchive) + { + // NOTE: retrieve jbpm engine directly as this servlet only serves JBPM process designer deployments + WebApplicationContext wc = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); + WorkflowDefinitionComponent jbpmEngine = (WorkflowDefinitionComponent)wc.getBean("jbpm_engine"); + return jbpmEngine.deployDefinition(deploymentArchive, MimetypeMap.MIMETYPE_ZIP); + } + + + /** + * NOTE: Workaround... + * + * The JBPM process designer (as of 3.1.2) issues a request with a multi-part line + * delimited by ",". It should be ":" according to the HTTP specification which + * the commons file-upload is adhering to. + * + * @author davidc + */ + @SuppressWarnings("deprecation") + private class GPDUpload extends DiskFileUpload + { + @Override + protected byte[] getBoundary(String contentType) + { + return super.getBoundary(contentType.replace(",", ";")); + } + } + +} \ No newline at end of file diff --git a/source/java/org/jbpm/webapp/servlet/DeployServlet.java b/source/java/org/jbpm/webapp/servlet/DeployServlet.java deleted file mode 100644 index d6df976170..0000000000 --- a/source/java/org/jbpm/webapp/servlet/DeployServlet.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * JBoss, Home of Professional Open Source - * Copyright 2005, JBoss Inc., and individual contributors as indicated - * by the @authors tag. See the copyright.txt in the distribution for a - * full listing of individual contributors. - * - * This is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this software; if not, write to the Free - * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA, or see the FSF site: http://www.fsf.org. - */ -package org.jbpm.webapp.servlet; - -import java.io.IOException; -import java.io.PrintWriter; -import java.net.URL; -import java.util.zip.ZipInputStream; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.jbpm.JbpmContext; -import org.jbpm.graph.def.ProcessDefinition; - -/** - * servlet to be used by the process designer to deploy processes. - */ -public class DeployServlet extends HttpServlet { - - private static final long serialVersionUID = 1L; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String archive = request.getParameter("archive"); - log.debug("deploying archive "+archive); - - PrintWriter writer = response.getWriter(); - try { - URL archiveUrl = new URL(archive); - ZipInputStream zis = new ZipInputStream(archiveUrl.openStream()); - JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext(); - ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zis); - jbpmContext.deployProcessDefinition(processDefinition); - zis.close(); - - writer.write("Deployed archive "+archive+" successfully"); - - } catch (Exception e) { - e.printStackTrace(); - writer.write("Deploying archive "+archive+" failed"); - } - } - - private static Log log = LogFactory.getLog(DeployServlet.class); -} diff --git a/source/java/org/jbpm/webapp/servlet/UploadServlet.java b/source/java/org/jbpm/webapp/servlet/UploadServlet.java deleted file mode 100644 index 6947436eb4..0000000000 --- a/source/java/org/jbpm/webapp/servlet/UploadServlet.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * JBoss, Home of Professional Open Source - * Copyright 2005, JBoss Inc., and individual contributors as indicated - * by the @authors tag. See the copyright.txt in the distribution for a - * full listing of individual contributors. - * - * This is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this software; if not, write to the Free - * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA, or see the FSF site: http://www.fsf.org. - */ -package org.jbpm.webapp.servlet; - -import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.zip.ZipInputStream; - -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.fileupload.DiskFileUpload; -import org.apache.commons.fileupload.FileItem; -import org.apache.commons.fileupload.FileUpload; -import org.apache.commons.fileupload.FileUploadException; -import org.apache.commons.fileupload.ParameterParser; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.jbpm.JbpmContext; -import org.jbpm.graph.def.ProcessDefinition; - -public class UploadServlet extends HttpServlet { - - private static final long serialVersionUID = 1L; - - - private class GPDUpload extends DiskFileUpload - { - - @Override - protected byte[] getBoundary(String contentType) - { - return super.getBoundary(contentType.replace(",", ";")); - } - } - - - public void service(HttpServletRequest request, HttpServletResponse response) - throws IOException { - response.setContentType("text/html"); - response.getWriter().println(handleRequest(request)); - } - - public void printInput(HttpServletRequest request) throws IOException { - InputStream inputStream = request.getInputStream(); - StringBuffer buffer = new StringBuffer(); - int read; - while ((read = inputStream.read()) != -1) { - buffer.append((char)read); - } - log.debug(buffer.toString()); - } - - private String handleRequest(HttpServletRequest request) { - if (!FileUpload.isMultipartContent(request)) { - log.debug("Not a multipart request"); - return "Not a multipart request"; - } - try { - GPDUpload fileUpload = new GPDUpload(); - List list = fileUpload.parseRequest(request); - Iterator iterator = list.iterator(); - if (!iterator.hasNext()) { - log.debug("No process file in the request"); - return "No process file in the request"; - } - FileItem fileItem = (FileItem)iterator.next(); - if (fileItem.getContentType().indexOf("application/x-zip-compressed") == -1) { - log.debug("Not a process archive"); - return "Not a process archive"; - } - return doDeployment(fileItem); - } catch (FileUploadException e) { - e.printStackTrace(); - return "FileUploadException"; - } - } - - private String doDeployment(FileItem fileItem) { - try { - ZipInputStream zipInputStream = new ZipInputStream(fileItem.getInputStream()); - JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext(); - ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream); - log.debug("Created a processdefinition : " + processDefinition.getName() ); - jbpmContext.deployProcessDefinition(processDefinition); - zipInputStream.close(); - return "Deployed archive " + processDefinition.getName() + " successfully"; - } catch (IOException e) { - return "IOException"; - } - } - - private static Log log = LogFactory.getLog(UploadServlet.class); - -} \ No newline at end of file diff --git a/source/web/WEB-INF/web.xml b/source/web/WEB-INF/web.xml index 33800b0aa1..6ae45b32a1 100644 --- a/source/web/WEB-INF/web.xml +++ b/source/web/WEB-INF/web.xml @@ -157,10 +157,6 @@ JbpmContextFilter /faces/jsp/dashboards/* - - JbpmContextFilter - /upload - @@ -260,16 +262,6 @@ org.jbpm.webapp.servlet.ProcessImageServlet - - - DeployServlet - org.jbpm.webapp.servlet.DeployServlet - - - UploadServlet - org.jbpm.webapp.servlet.UploadServlet - - @@ -319,6 +311,11 @@ /webdav/* + + JBPMDeployProcessServlet + /jbpm/deployprocess + + @@ -337,16 +334,6 @@ /processimage - - - DeployServlet - /deploy - - - UploadServlet - /upload - -