001: /*
002: * Copyright 2007 Outerthought bvba and Schaubroeck nv
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.outerj.daisy.workflow.serverimpl.httpconnector.handlers;
017:
018: import org.outerj.daisy.httpconnector.spi.HttpUtil;
019: import org.outerj.daisy.httpconnector.spi.RequestHandlerSupport;
020: import org.outerj.daisy.repository.Repository;
021: import org.outerj.daisy.workflow.WorkflowManager;
022: import org.outerj.daisy.workflow.TaskUpdateData;
023: import org.outerj.daisy.workflow.WfTask;
024: import org.outerj.daisy.workflow.WfActorKey;
025: import org.outerj.daisy.workflow.commonimpl.WfXmlHelper;
026: import org.outerj.daisy.xmlutil.LocalSAXParserFactory;
027: import org.outerj.daisy.util.HttpConstants;
028: import org.outerx.daisy.x10Workflow.UpdateTaskDocument;
029: import org.apache.xmlbeans.XmlOptions;
030:
031: import javax.servlet.http.HttpServletRequest;
032: import javax.servlet.http.HttpServletResponse;
033: import java.util.Map;
034: import java.util.Locale;
035: import java.util.List;
036: import java.util.ArrayList;
037:
038: public class TaskHandler extends AbstractWorkflowRequestHandler {
039: public void handleRequest(Map matchMap, HttpServletRequest request,
040: HttpServletResponse response, Repository repository,
041: RequestHandlerSupport support) throws Exception {
042: WorkflowManager workflowManager = (WorkflowManager) repository
043: .getExtension("WorkflowManager");
044: String id = (String) matchMap.get("1");
045: Locale locale = WfHttpUtil.getLocale(request);
046:
047: WfTask task = null;
048: if (request.getMethod().equals(HttpConstants.GET)) {
049: task = workflowManager.getTask(id, locale);
050: } else if (request.getMethod().equals(HttpConstants.POST)) {
051: String action = request.getParameter("action");
052:
053: if (action == null) {
054: XmlOptions xmlOptions = new XmlOptions()
055: .setLoadUseXMLReader(LocalSAXParserFactory
056: .newXmlReader());
057: UpdateTaskDocument document = UpdateTaskDocument.Factory
058: .parse(request.getInputStream(), xmlOptions);
059: UpdateTaskDocument.UpdateTask xml = document
060: .getUpdateTask();
061:
062: boolean end = xml.isSetEndTask() ? xml.getEndTask()
063: : false;
064:
065: TaskUpdateData taskUpdateData;
066: if (xml.isSetTaskUpdateData()) {
067: taskUpdateData = WfXmlHelper
068: .instantiateTaskUpdateData(xml
069: .getTaskUpdateData());
070: } else {
071: taskUpdateData = new TaskUpdateData();
072: }
073:
074: if (end) {
075: task = workflowManager.endTask(id, taskUpdateData,
076: xml.getTransitionName(), locale);
077: } else {
078: task = workflowManager.updateTask(id,
079: taskUpdateData, locale);
080: }
081: } else if (action.equals("requestPooledTask")) {
082: task = workflowManager.requestPooledTask(id, locale);
083: } else if (action.equals("unassignTask")) {
084: task = workflowManager.unassignTask(id, locale);
085: } else if (action.equals("assignTask")) {
086: boolean overwriteSwimlane = HttpUtil.getBooleanParam(
087: request, "overwriteSwimlane");
088: String actorType = HttpUtil.getStringParam(request,
089: "actorType");
090: WfActorKey actor;
091: if (actorType.equals("user")) {
092: long actorId = HttpUtil.getLongParam(request,
093: "actor");
094: actor = new WfActorKey(actorId);
095: } else if (actorType.equals("pools")) {
096: String[] actorIds = request
097: .getParameterValues("actor");
098: List<Long> parsedActorIds = new ArrayList<Long>();
099: for (String actorId : actorIds) {
100: if (actorId.length() > 0) {
101: parsedActorIds.add(Long.parseLong(actorId));
102: }
103: }
104: actor = new WfActorKey(parsedActorIds);
105: } else {
106: HttpUtil.sendCustomError(
107: "Invalid value for actorType parameter: "
108: + actorType,
109: HttpConstants._400_Bad_Request, response);
110: return;
111: }
112: task = workflowManager.assignTask(id, actor,
113: overwriteSwimlane, locale);
114: } else {
115: HttpUtil
116: .sendCustomError(
117: "Invalid value for action parameter: "
118: + action,
119: HttpConstants._400_Bad_Request,
120: response);
121: }
122: } else {
123: response.sendError(HttpConstants._405_Method_Not_Allowed);
124: }
125:
126: if (task != null)
127: task.getXml().save(response.getOutputStream());
128: }
129:
130: public String getPathPattern() {
131: return "/task/*";
132: }
133: }
|