package org.orienteer.bpm.camunda.handler;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.camunda.bpm.engine.impl.db.ListQueryParameterObject;
import org.camunda.bpm.engine.impl.event.CompensationEventHandler;
import org.camunda.bpm.engine.impl.persistence.entity.CompensateEventSubscriptionEntity;
import org.camunda.bpm.engine.impl.persistence.entity.DeploymentEntity;
import org.camunda.bpm.engine.impl.persistence.entity.EventSubscriptionEntity;
import org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity;
import org.camunda.bpm.engine.impl.persistence.entity.MessageEventSubscriptionEntity;
import org.camunda.bpm.engine.impl.persistence.entity.SignalEventSubscriptionEntity;
import org.orienteer.bpm.camunda.OPersistenceSession;
import org.orienteer.core.OClassDomain;
import org.orienteer.core.util.OSchemaHelper;
import com.github.raymanrt.orientqb.query.Clause;
import com.github.raymanrt.orientqb.query.Operator;
import com.github.raymanrt.orientqb.query.Query;
import com.google.common.base.Function;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.record.impl.ODocument;
/**
* {@link IEntityHandler} for {@link EventSubscriptionEntity}
*/
public class EventSubscriptionEntityHandler extends AbstractEntityHandler<EventSubscriptionEntity> {
public static final String OCLASS_NAME = "BPMEventSubscription";
public EventSubscriptionEntityHandler() {
super(OCLASS_NAME);
}
@Override
public void applySchema(OSchemaHelper helper) {
super.applySchema(helper);
helper.domain(OClassDomain.SYSTEM);
helper.oProperty("eventType", OType.STRING, 10)
.oProperty("eventName", OType.STRING, 20)
.oProperty("execution", OType.LINK, 30).assignVisualization("listbox")
.oProperty("processInstanceId", OType.STRING, 40)
.oProperty("activityId", OType.STRING, 50)
.oProperty("configuration", OType.STRING, 60)
.oProperty("created", OType.DATETIME, 70);
}
@Override
public void applyRelationships(OSchemaHelper helper) {
super.applyRelationships(helper);
helper.setupRelationship(EventSubscriptionEntityHandler.OCLASS_NAME, "execution", ExecutionEntityHandler.OCLASS_NAME, "eventSubscriptions");
}
@Override
public EventSubscriptionEntity mapToEntity(ODocument doc, EventSubscriptionEntity entity,
OPersistenceSession session) {
if(entity==null) {
String eventType = doc.field("eventType");
switch (eventType) {
case CompensationEventHandler.EVENT_HANDLER_TYPE:
entity = new CompensateEventSubscriptionEntity();
break;
case MessageEventSubscriptionEntity.EVENT_TYPE:
entity = new MessageEventSubscriptionEntity();
break;
case SignalEventSubscriptionEntity.EVENT_TYPE:
entity = new SignalEventSubscriptionEntity();
break;
}
}
return super.mapToEntity(doc, entity, session);
}
@Statement
public List<EventSubscriptionEntity> selectEventSubscriptionsByExecutionAndType(OPersistenceSession session, final ListQueryParameterObject parameter) {
return selectEventSubscriptionsByNameAndExecution(session, parameter);
}
@Statement
public List<EventSubscriptionEntity> selectEventSubscriptionsByNameAndExecution(OPersistenceSession session, final ListQueryParameterObject parameter) {
Map<String, String> map=((Map<String, String>)parameter.getParameter());
List<EventSubscriptionEntity> result=new ArrayList<EventSubscriptionEntity>();
ExecutionEntity entity = HandlersManager.get().getHandler(ExecutionEntity.class).read(map.get("executionId"), session);
if(entity==null){
return result;
}
for(EventSubscriptionEntity eventSubscriptionEntity:entity.getEventSubscriptions()){
if((!map.containsKey("eventType") || Objects.equals(eventSubscriptionEntity.getEventType(), map.get("eventType")))
&& (!map.containsKey("eventName") || Objects.equals(eventSubscriptionEntity.getEventName(), map.get("eventName")))) {
result.add(eventSubscriptionEntity);
}
}
return result;
}
@Statement
public List<EventSubscriptionEntity> selectEventSubscriptionsByExecution(OPersistenceSession session, ListQueryParameterObject parameter) {
return queryList(session, "select from "+getSchemaClass()+" where execution.id=?", parameter.getParameter());
}
@Statement
public List<EventSubscriptionEntity> selectEventSubscriptionsByConfiguration(OPersistenceSession session, ListQueryParameterObject params) {
Map<String, Object> map = (Map<String, Object>) params.getParameter();
return queryList(session, "select from "+getSchemaClass()+" where configuration=? and eventType=?",
map.get("configuration"),
map.get("eventType"));
}
@Statement
public List<EventSubscriptionEntity> selectMessageStartEventSubscriptionByName(OPersistenceSession session, ListQueryParameterObject params) {
return queryList(session, "select from "+getSchemaClass()+" where eventType = ? and execution.id is null and eventName = ?",
MessageEventSubscriptionEntity.EVENT_TYPE,
params.getParameter());
}
}