package org.orienteer.bpm.camunda;
import java.util.List;
import org.apache.wicket.util.string.Strings;
import org.camunda.bpm.BpmPlatform;
import org.camunda.bpm.engine.impl.context.Context;
import org.camunda.bpm.engine.impl.persistence.deploy.DeploymentCache;
import org.camunda.bpm.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.camunda.bpm.model.bpmn.Bpmn;
import org.orienteer.bpm.BPMModule;
import org.orienteer.bpm.camunda.handler.DeploymentEntityHandler;
import org.orienteer.bpm.camunda.handler.HandlersManager;
import org.orienteer.bpm.camunda.handler.IEntityHandler;
import org.orienteer.bpm.camunda.handler.ProcessDefinitionEntityHandler;
import com.orientechnologies.orient.core.db.ODatabaseRecordThreadLocal;
import com.orientechnologies.orient.core.db.ODatabase.STATUS;
import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
import com.orientechnologies.orient.core.db.record.OIdentifiable;
import com.orientechnologies.orient.core.hook.ODocumentHookAbstract;
import com.orientechnologies.orient.core.hook.ORecordHook;
import com.orientechnologies.orient.core.hook.ORecordHook.RESULT;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
/**
* Hook to handle BPMN specific entities
*/
public class BpmnHook implements ORecordHook {
protected ODatabaseDocument database;
public BpmnHook() {
this.database = ODatabaseRecordThreadLocal.INSTANCE.get();
}
public BpmnHook(ODatabaseDocument database) {
this.database = database;
}
@Override
public DISTRIBUTED_EXECUTION_MODE getDistributedExecutionMode() {
return DISTRIBUTED_EXECUTION_MODE.BOTH;
}
@Override
public RESULT onTrigger(TYPE iType, ORecord iRecord) {
if (database.getStatus() != STATUS.OPEN)
return RESULT.RECORD_NOT_CHANGED;
if (!(iRecord instanceof ODocument))
return RESULT.RECORD_NOT_CHANGED;
final ODocument doc = (ODocument) iRecord;
OClass oClass = doc.getSchemaClass();
RESULT res = RESULT.RECORD_NOT_CHANGED;
if(oClass!=null && oClass.isSubClassOf(IEntityHandler.BPM_ENTITY_CLASS)) {
if(iType.equals(TYPE.BEFORE_CREATE)) {
if(doc.field("id")==null) {
doc.field("id", getNextId());
res = RESULT.RECORD_CHANGED;
}
}
RESULT handlerRes = HandlersManager.get().onTrigger(database, doc, iType);
res = (handlerRes == RESULT.RECORD_NOT_CHANGED || handlerRes==null)?res:handlerRes;
}
return res;
}
public static String getNextId() {
return ((OProcessEngineConfiguration) BpmPlatform.getDefaultProcessEngine()
.getProcessEngineConfiguration()).getIdGenerator().getNextId();
}
@Override
public void onUnregister() {
}
}