/*
* Copyright 2011 JBoss Inc
*
* 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.jbpm.formbuilder.server;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.jbpm.formapi.server.form.FormEncodingServerFactory;
import org.jbpm.formapi.shared.api.FormRepresentation;
import org.jbpm.formapi.shared.form.FormEncodingException;
import org.jbpm.formapi.shared.form.FormEncodingFactory;
import org.jbpm.formapi.shared.form.FormRepresentationEncoder;
import org.jbpm.formbuilder.server.form.GuvnorFormDefinitionService;
import org.jbpm.formbuilder.server.task.GuvnorTaskDefinitionService;
import org.jbpm.formbuilder.shared.form.FormDefinitionService;
import org.jbpm.formbuilder.shared.form.FormServiceException;
import org.jbpm.formbuilder.shared.task.TaskDefinitionService;
import org.jbpm.formbuilder.shared.task.TaskPropertyRef;
import org.jbpm.formbuilder.shared.task.TaskRef;
import org.jbpm.formbuilder.shared.task.TaskServiceException;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
public class EmbedingServlet extends HttpServlet {
private static final long serialVersionUID = -5943196576708424978L;
@Override
public void init(ServletConfig config) throws ServletException {
FormEncodingFactory.register(FormEncodingServerFactory.getEncoder(), FormEncodingServerFactory.getDecoder());
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String profile = request.getParameter("profile");
String usr = request.getParameter("usr");
String pwd = request.getParameter("pwd");
TaskDefinitionService taskService = createTaskService(request, usr, pwd);
FormDefinitionService formService = createFormService(request, usr, pwd);
FormRepresentationEncoder encoder = FormEncodingFactory.getEncoder();
JsonObject json = new JsonObject();
json.addProperty("embedded", profile);
try {
if (profile != null && "guvnor".equals(profile)) {
String uuid = request.getParameter("uuid");
String packageName = taskService.getContainingPackage(uuid);
FormRepresentation form = formService.getFormByUUID(packageName, uuid);
json.addProperty("uuid", uuid);
json.addProperty("packageName", packageName);
if (form != null) {
json.addProperty("formjson", encoder.encode(form));
}
}else {
throw new Exception("Unknown profile for GET: " + profile);
}
request.setAttribute("jsonData", new Gson().toJson(json));
request.getRequestDispatcher("/FormBuilder.jsp").forward(request, response);
} catch (TaskServiceException e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Problem getting task from guvnor");
} catch (FormServiceException e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Problem reading form from guvnor");
} catch (FormEncodingException e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Problem encoding form");
} catch (Exception e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
String profile = request.getParameter("profile");
String usr = request.getParameter("usr");
String pwd = request.getParameter("pwd");
TaskDefinitionService taskService = createTaskService(request, usr, pwd);
FormDefinitionService formService = createFormService(request, usr, pwd);
FormRepresentationEncoder encoder = FormEncodingFactory.getEncoder();
JsonObject json = new JsonObject();
json.addProperty("embedded", profile);
try {
if ( profile != null && "designer".equals(profile)) {
String userTask = request.getParameter("userTask");
String processName = request.getParameter("processName");
String bpmn2Process = IOUtils.toString(request.getReader());
TaskRef task = taskService.getBPMN2Task(bpmn2Process, processName, userTask);
if (task != null) {
//get associated form if it exists
FormRepresentation form = formService.getAssociatedForm(task.getPackageName(), task);
if (form != null) {
json.addProperty("formjson", encoder.encode(form));
}
json.add("task", toJsonObject(task));
json.addProperty("packageName", task.getPackageName());
}
} else {
throw new Exception("Unknown profile for POST: " + profile);
}
request.setAttribute("jsonData", new Gson().toJson(json));
request.getRequestDispatcher("/FormBuilder.jsp").forward(request, response);
} catch (TaskServiceException e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Problem getting task from guvnor");
} catch (FormServiceException e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Problem reading form from guvnor");
} catch (FormEncodingException e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Problem encoding form");
} catch (Exception e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
}
}
protected FormDefinitionService createFormService(HttpServletRequest request, String usr, String pwd) {
GuvnorFormDefinitionService service = (GuvnorFormDefinitionService) WebApplicationContextUtils.
getWebApplicationContext(request.getSession().getServletContext()).getBean("guvnorFormService");
if (usr != null && pwd != null) {
service.setUser(usr);
service.setPassword(pwd);
try {
service.afterPropertiesSet();
} catch (Exception e) { }
}
return service;
}
protected TaskDefinitionService createTaskService(HttpServletRequest request, String usr, String pwd) {
GuvnorTaskDefinitionService service = (GuvnorTaskDefinitionService) WebApplicationContextUtils.
getWebApplicationContext(request.getSession().getServletContext()).getBean("guvnorTaskService");
if (usr != null && pwd != null) {
service.setUser(usr);
service.setPassword(pwd);
try {
service.afterPropertiesSet();
} catch (Exception e) { }
}
return service;
}
private JsonObject toJsonObject(TaskRef task) {
JsonObject jsonTask = new JsonObject();
jsonTask.addProperty("processId", task.getProcessId());
jsonTask.addProperty("taskId", task.getTaskId());
jsonTask.addProperty("taskName", task.getTaskName());
JsonArray jsonInputs = new JsonArray();
List<TaskPropertyRef> inputs = task.getInputs();
if (inputs != null) {
for (TaskPropertyRef input : inputs) {
JsonObject jsonInput = new JsonObject();
jsonInput.addProperty("name", input.getName());
jsonInput.addProperty("sourceExpression", input.getSourceExpresion());
jsonInputs.add(jsonInput);
}
}
jsonTask.add("inputs", jsonInputs);
JsonArray jsonOutputs = new JsonArray();
List<TaskPropertyRef> outputs = task.getOutputs();
if (outputs != null) {
for (TaskPropertyRef output : outputs) {
JsonObject jsonOutput = new JsonObject();
jsonOutput.addProperty("name", output.getName());
jsonOutput.addProperty("sourceExpression", output.getSourceExpresion());
jsonOutputs.add(jsonOutput);
}
}
jsonTask.add("outputs", jsonOutputs);
JsonObject jsonMetaData = new JsonObject();
Map<String, String> metaData = task.getMetaData();
if (metaData != null) {
for (Map.Entry<String, String> entry : metaData.entrySet()) {
jsonMetaData.addProperty(entry.getKey(), entry.getValue());
}
}
jsonTask.add("metaData", jsonMetaData);
return jsonTask;
}
}