/*
* Copyright 2008 Tom Huybrechts and hudson.dev.java.net
*
* 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 hudson.jbpm;
import hudson.Plugin;
import hudson.jbpm.model.TaskInstanceWrapper;
import hudson.jbpm.rendering.GraphicsUtil;
import hudson.model.Hudson;
import hudson.model.Job;
import hudson.model.TopLevelItem;
import hudson.util.PluginServletFilter;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Logger;
import java.util.zip.ZipInputStream;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import org.acegisecurity.Authentication;
import org.acegisecurity.userdetails.UserDetails;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.db.TaskMgmtSession;
import org.jbpm.file.def.FileDefinition;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
public class PluginImpl extends Plugin {
private static Logger log = Logger.getLogger("hudson.jbpm");
public static PluginImpl INSTANCE;
private ProcessDefinition processDefinition;
public ProcessDefinition getProcessDefinition() {
return processDefinition;
}
public PluginImpl() {
}
@Override
public void start() throws Exception {
JbpmConfiguration.getInstance().startJobExecutor();
PluginServletFilter.addFilter(new JbpmContextFilter());
GraphicsUtil.class.getName(); // trigger icon initialization
INSTANCE = this;
}
public List<ProcessDefinition> getProcessDefinitions() {
JbpmContext context = getCurrentJbpmContext();
return context.getGraphSession().findAllProcessDefinitions();
}
public List<ProcessDefinition> getLatestProcessDefinitions() {
JbpmContext context = getCurrentJbpmContext();
return context.getGraphSession().findLatestProcessDefinitions();
}
public ProcessInstance getProcessInstance(long processInstanceId) {
JbpmContext context = getCurrentJbpmContext();
return context.getGraphSession().getProcessInstance(processInstanceId);
}
public List<ProcessInstance> getProcessInstances(
ProcessDefinition definition) {
JbpmContext context = getCurrentJbpmContext();
return context.getGraphSession().findProcessInstances(
definition.getId());
}
public TaskInstanceWrapper getTaskInstance(String taskInstanceId) {
long l = Long.parseLong(taskInstanceId);
return new TaskInstanceWrapper(getCurrentJbpmContext().getTaskInstance(
l));
}
private static JbpmContext getCurrentJbpmContext() {
return JbpmConfiguration.getInstance().getCurrentJbpmContext();
}
public List<TaskInstance> getOpenTasks(ProcessInstance processInstance) {
JbpmContext context = getCurrentJbpmContext();
List<TaskInstance> result = context.getTaskMgmtSession()
.findTaskInstancesByProcessInstance(processInstance);
return result;
}
public List<TaskInstance> getPooledTasks() {
JbpmContext context = getCurrentJbpmContext();
TaskMgmtSession taskMgmtSession = context.getTaskMgmtSession();
if (!Hudson.getAuthentication().isAuthenticated()) {
return Collections.emptyList();
}
List<String> projectNames = new ArrayList<String>();
for (TopLevelItem item : Hudson.getInstance().getItems()) {
if ((item instanceof Job)
&& ((Job) item).hasPermission(Job.CONFIGURE)) {
projectNames.add(item.getName());
}
}
if (projectNames.isEmpty()) {
return Collections.emptyList();
}
List<TaskInstance> result = taskMgmtSession
.findPooledTaskInstances(projectNames);
return result;
}
/**
* Draws a JPEG for a process definition
*
* @param req
* @param rsp
* @param processDefinition
* @throws IOException
*/
public void doProcessDefinitionImage(StaplerRequest req,
StaplerResponse rsp,
@QueryParameter("processDefinition") long processDefinition)
throws IOException {
JbpmContext context = getCurrentJbpmContext();
ProcessDefinition definition = context.getGraphSession()
.getProcessDefinition(processDefinition);
FileDefinition fd = definition.getFileDefinition();
byte[] bytes = fd.getBytes("processimage.jpg");
rsp.setContentType("image/jpeg");
ServletOutputStream output = rsp.getOutputStream();
BufferedImage loaded = ImageIO.read(new ByteArrayInputStream(bytes));
BufferedImage aimg = new BufferedImage(loaded.getWidth(), loaded
.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = aimg.createGraphics();
g.drawImage(loaded, null, 0, 0);
g.dispose();
ImageIO.write(aimg, "jpg", output);
output.flush();
output.close();
}
/**
* Method supporting upload from the designer at /plugin/jbpm/upload
*/
public void doUpload(StaplerRequest req, StaplerResponse rsp)
throws FileUploadException, IOException, ServletException {
try {
ServletFileUpload upload = new ServletFileUpload(
new DiskFileItemFactory());
// Parse the request
FileItem fileItem = (FileItem) upload.parseRequest(req).get(0);
if (fileItem.getContentType().indexOf("application/x-zip-compressed") == -1) {
throw new IOException("Not a process archive");
}
log.fine("Deploying process archive " + fileItem.getName());
ZipInputStream zipInputStream = new ZipInputStream(fileItem
.getInputStream());
JbpmContext jbpmContext = getCurrentJbpmContext();
log.fine("Preparing to parse process archive");
ProcessDefinition processDefinition = ProcessDefinition
.parseParZipInputStream(zipInputStream);
log
.fine("Created a processdefinition : "
+ processDefinition.getName());
jbpmContext.deployProcessDefinition(processDefinition);
zipInputStream.close();
rsp.forwardToPreviousPage(req);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void stop() throws Exception {
JbpmConfiguration.getInstance().getJobExecutor().stop();
}
public List<TaskInstance> getUserTasks() {
Authentication authentication = Hudson.getAuthentication();
if ("anonymous".equals(authentication.getPrincipal())) {
return Collections.emptyList();
}
JbpmContext context = getCurrentJbpmContext();
String userName = ((UserDetails) authentication
.getPrincipal()).getUsername();
return context.getTaskList(userName);
}
public static void injectTransientVariables(ContextInstance contextInstance) {
contextInstance.setTransientVariable("hudson", Hudson.getInstance());
}
}