/* 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.activiti.explorer.reporting;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import org.activiti.bpmn.BpmnAutoLayout;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.explorer.ExplorerApp;
import org.activiti.workflow.simple.converter.WorkflowDefinitionConversion;
import org.activiti.workflow.simple.definition.WorkflowDefinition;
/**
* @author Joram Barrez
*/
public class ReportingUtil {
public static Connection getCurrentDatabaseConnection() {
return Context.getCommandContext().getDbSqlSession().getSqlSession().getConnection();
}
public static ResultSet executeSelectSqlQuery(String sql) throws Exception {
Connection connection = getCurrentDatabaseConnection();
Statement select = connection.createStatement();
return select.executeQuery(sql);
}
public static ProcessDefinition getProcessDefinition(DelegateExecution delegateExecution) {
ExecutionEntity executionEntity = (ExecutionEntity) delegateExecution;
if (executionEntity.getProcessDefinition() != null) {
return (ProcessDefinition) executionEntity.getProcessDefinition();
} else {
return ProcessEngines.getDefaultProcessEngine()
.getRepositoryService()
.createProcessDefinitionQuery()
.processDefinitionId(delegateExecution.getProcessDefinitionId())
.singleResult();
}
}
// WARNING!!! DemoWare!!!
public static void generateTaskDurationReport(String processDefinitionId) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
// Fetch process definition
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
// Report descriptin
String reportDescription = "Average task duration report for process definition " + processDefinition.getName() + " ( version " + processDefinition.getVersion() + ")";
// Script (just plain String for the moment)
String script = "importPackage(java.sql);" +
"importPackage(java.lang);" +
"importPackage(org.activiti.explorer.reporting);" +
"" +
"var processDefinitionId = '" + processDefinitionId + "';" +
"" +
"var result = ReportingUtil.executeSelectSqlQuery(\"select NAME_, avg(DURATION_) from ACT_HI_TASKINST where PROC_DEF_ID_ = '"
+ processDefinitionId + "' and END_TIME_ is not null group by NAME_\");" +
"" +
"var reportData = new ReportData();" +
"var dataset = reportData.newDataset();" +
"dataset.type = 'pieChart';" +
"dataset.description = '" + reportDescription + "';" +
"" +
"while (result.next()) { "+
" var name = result.getString(1);" +
" var val = result.getLong(2) / 1000;" +
" dataset.add(name, val);" +
"}" +
"" +
"execution.setVariable('reportData', reportData.toBytes());";
// Generate bpmn model
WorkflowDefinition workflowDefinition = new WorkflowDefinition()
.name(processDefinition.getName() + " task duration report")
.description(reportDescription)
.addScriptStep(script);
// Convert to BPMN 2.0 XML
WorkflowDefinitionConversion conversion = ExplorerApp.get().getWorkflowDefinitionConversionFactory()
.createWorkflowDefinitionConversion(workflowDefinition);
conversion.convert();
conversion.getBpmnModel().setTargetNamespace("activiti-report");
// Generate DI
BpmnAutoLayout bpmnAutoLayout = new BpmnAutoLayout(conversion.getBpmnModel());
bpmnAutoLayout.execute();
// Deploy
repositoryService.createDeployment()
.name(processDefinition.getName() + " - task duration report")
.addString(conversion.getProcess().getId() + ".bpmn20.xml", conversion.getBpmn20Xml())
.deploy();
}
}