package org.orienteer.bpm.camunda.handler;
import java.util.List;
import java.util.Map;
import org.camunda.bpm.engine.impl.db.ListQueryParameterObject;
import org.camunda.bpm.engine.impl.persistence.deploy.DeploymentCache;
import org.camunda.bpm.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.camunda.bpm.engine.repository.ProcessDefinitionQuery;
import org.orienteer.bpm.camunda.BpmnHook;
import org.orienteer.bpm.camunda.OPersistenceSession;
import org.orienteer.bpm.camunda.OProcessEngineConfiguration;
import org.orienteer.bpm.camunda.handler.history.HistoricEventHandler;
import org.orienteer.bpm.camunda.handler.history.HistoricProcessInstanceEventEntityHandler;
import org.orienteer.bpm.camunda.handler.history.HistoricVariableInstanceEntityHandler;
import org.orienteer.core.util.OSchemaHelper;
import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
import com.orientechnologies.orient.core.hook.ORecordHook.RESULT;
import com.orientechnologies.orient.core.hook.ORecordHook.TYPE;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.OCommandSQL;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
/**
* {@link IEntityHandler} for {@link ProcessDefinitionEntity}es
*/
public class ProcessDefinitionEntityHandler extends AbstractEntityHandler<ProcessDefinitionEntity> {
public static final String OCLASS_NAME = "BPMProcessDefinition";
public ProcessDefinitionEntityHandler() {
super(OCLASS_NAME);
}
@Override
public void applySchema(OSchemaHelper helper) {
super.applySchema(helper);
helper.oProperty("name", OType.STRING, 10).markDisplayable().markAsDocumentName().notNull(true)
.oProperty("key", OType.STRING, 30).notNull(true).markDisplayable()
.oProperty("resourceName", OType.STRING, 35)
.oProperty("category", OType.STRING, 40).markDisplayable()
.oProperty("deployment", OType.LINK, 60).assignVisualization("listbox").markDisplayable().markAsLinkToParent()
.oProperty("executions", OType.LINKLIST, 70).assignVisualization("table")
.oProperty("suspensionState", OType.INTEGER, 80).defaultValue("1").notNull()
.oProperty("tasks", OType.LINKLIST, 90).assignVisualization("table")
.oProperty("historyEvents", OType.LINKLIST, 100).assignTab("history").assignVisualization("table")
.oProperty("historyVariableInstances", OType.LINKLIST, 110).assignTab("history").assignVisualization("table");
}
@Override
public void applyRelationships(OSchemaHelper helper) {
super.applyRelationships(helper);
helper.setupRelationship(OCLASS_NAME, "deployment", DeploymentEntityHandler.OCLASS_NAME, "processDefinitions");
helper.setupRelationship(OCLASS_NAME, "executions", ExecutionEntityHandler.OCLASS_NAME, "processDefinition");
helper.setupRelationship(OCLASS_NAME, "tasks", TaskEntityHandler.OCLASS_NAME, "processDefinition");
helper.setupRelationship(OCLASS_NAME, "historyEvents", HistoricEventHandler.OCLASS_NAME, "processDefinition");
helper.setupRelationship(OCLASS_NAME, "historyVariableInstances", HistoricVariableInstanceEntityHandler.OCLASS_NAME, "processDefinition");
}
@Override
public RESULT onTrigger(ODatabaseDocument db, ODocument doc, TYPE iType) {
if(iType.equals(TYPE.BEFORE_CREATE)) {
ODocument deployment = doc.field("deployment");
if(deployment==null) {
List<ODocument> deployments = db.query(new OSQLSynchQuery<>("select from "+DeploymentEntityHandler.OCLASS_NAME, 1));
deployment = deployments!=null && !deployments.isEmpty()?deployments.get(0):null;
if(deployment==null) {
deployment = new ODocument(DeploymentEntityHandler.OCLASS_NAME);
deployment.field("id", BpmnHook.getNextId());
deployment.field("name", "Orienteer");
deployment.save();
}
doc.field("deployment", deployment);
return RESULT.RECORD_CHANGED;
}
} else if(iType.equals(TYPE.AFTER_UPDATE) || iType.equals(TYPE.AFTER_DELETE)) {
DeploymentCache dc = OProcessEngineConfiguration.get().getDeploymentCache();
dc.removeProcessDefinition((String) doc.field("id"));
}
return RESULT.RECORD_NOT_CHANGED;
}
@Statement
public List<ProcessDefinitionEntity> selectLatestProcessDefinitionByKey(OPersistenceSession session, ListQueryParameterObject param) {
return queryList(session, "select from "+getSchemaClass()+" where key = ? order by @rid desc limit 1", param.getParameter());
}
@Statement
public ProcessDefinitionEntity selectLatestProcessDefinitionByKeyWithoutTenantId(OPersistenceSession session, Map<String, Object> params) {
return querySingle(session, "select from "+getSchemaClass()+" where key = ? order by @rid desc", params.get("processDefinitionKey"));
}
@Statement
public List<ProcessDefinitionEntity> selectProcessDefinitionByDeploymentId(OPersistenceSession session, ListQueryParameterObject param) {
return queryList(session, "select from "+getSchemaClass()+" where deployment.id = ?", param.getParameter());
}
@Statement
public List<ProcessDefinitionEntity> selectProcessDefinitionByKeyIn(OPersistenceSession session, ListQueryParameterObject params) {
String[] keys = (String[]) params.getParameter();
return queryList(session, "select from "+getSchemaClass()+" where key in ?", (Object)keys);
}
@Statement
public List<ProcessDefinitionEntity> selectProcessDefinitionsByQueryCriteria(OPersistenceSession session, ProcessDefinitionQuery query) {
return query(session, query);
}
@Statement
public ProcessDefinitionEntity selectProcessDefinitionByDeploymentAndKey(OPersistenceSession session, Map<String, Object> map) {
return querySingle(session, "select from "+getSchemaClass()+" where deployment.id = ? and key = ?", map.get("deploymentId"), map.get("processDefinitionKey"));
}
@Statement
public void deleteProcessDefinitionsByDeploymentId(OPersistenceSession session, String deploymentId) {
session.getDatabase().command(new OCommandSQL("delete from "+getSchemaClass()+" where deployment.id = ?"))
.execute(deploymentId);
}
}