/*
* Copyright 2014 Effektif GmbH.
*
* 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 com.effektif.workflow.test.serialization;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.effektif.workflow.api.WorkflowEngine;
import com.effektif.workflow.api.model.Deployment;
import com.effektif.workflow.api.model.Message;
import com.effektif.workflow.api.model.TriggerInstance;
import com.effektif.workflow.api.model.VariableValues;
import com.effektif.workflow.api.model.WorkflowInstanceId;
import com.effektif.workflow.api.query.WorkflowInstanceQuery;
import com.effektif.workflow.api.query.WorkflowQuery;
import com.effektif.workflow.api.workflow.ExecutableWorkflow;
import com.effektif.workflow.api.workflowinstance.WorkflowInstance;
import com.effektif.workflow.impl.WorkflowEngineImpl;
import com.effektif.workflow.impl.json.JsonStreamMapper;
/**
* @author Tom Baeyens
*/
public class SerializingWorkflowEngineImpl implements WorkflowEngine {
protected static final Logger log = LoggerFactory.getLogger(SerializingWorkflowEngineImpl.class+".JSON");
protected WorkflowEngineImpl workflowEngine;
protected JsonStreamMapper jsonMapper;
public SerializingWorkflowEngineImpl(WorkflowEngineImpl workflowEngine, JsonStreamMapper jsonStreamMapper) {
this.workflowEngine = workflowEngine;
this.jsonMapper = jsonStreamMapper;
}
protected <T> T wireize(String name, T o) {
if (o==null) return null;
Class<T> clazz = (Class<T>) o.getClass();
String jsonString = jsonMapper.write(o);
log.debug(name+jsonString);
return jsonMapper.readString(jsonString, clazz);
}
@Override
public Deployment deployWorkflow(ExecutableWorkflow workflow) {
log.debug("deployWorkflow");
workflow = wireize(" >>workflow>> ", workflow);
Deployment deployment = workflowEngine.deployWorkflow(workflow);
return wireize(" <<deployment<< ", deployment);
}
@Override
public List<ExecutableWorkflow> findWorkflows(WorkflowQuery query) {
log.debug("findWorkflow");
query = wireize(" >>query>> ", query);
List<ExecutableWorkflow> workflows = workflowEngine.findWorkflows(query);
if (workflows==null) {
return null;
}
List<ExecutableWorkflow> wirizedWorkflows = new ArrayList<>(workflows.size());
for (ExecutableWorkflow workflow: workflows) {
wirizedWorkflows.add(wireize(" <<workflow<< ", workflow));
}
return wirizedWorkflows;
}
@Override
public void deleteWorkflows(WorkflowQuery query) {
log.debug("deleteWorkflow");
query = wireize(" >>query>> ", query);
workflowEngine.deleteWorkflows(query);
}
@Override
public WorkflowInstance start(TriggerInstance triggerInstance) {
log.debug("startWorkflow");
triggerInstance = wireize(" >>start>> ", triggerInstance);
WorkflowInstance workflowInstance = workflowEngine.start(triggerInstance);
workflowInstance = wireize(" <<workflowInstance<< ", workflowInstance);
return workflowInstance;
}
@Override
public WorkflowInstance send(Message message) {
log.debug("sendMessage");
message = wireize(" >>message>> ", message);
WorkflowInstance workflowInstance = workflowEngine.send(message);
workflowInstance = wireize(" <<workflowInstance<< ", workflowInstance);
return workflowInstance;
}
@Override
public WorkflowInstance move(WorkflowInstanceId workflowInstanceId, String activityInstanceId, String newActivityId) {
log.debug("moveWorkflowInstance");
return workflowEngine.move(workflowInstanceId, newActivityId);
}
@Override
public WorkflowInstance move(WorkflowInstanceId workflowInstanceId, String newActivityId) {
return move(workflowInstanceId, null, newActivityId);
}
@Override
public VariableValues getVariableValues(WorkflowInstanceId workflowInstanceId) {
log.debug("getVariableValues");
VariableValues variableValues = workflowEngine.getVariableValues(workflowInstanceId);
variableValues = wireize(" <<variableValues<< ", variableValues);
return variableValues;
}
@Override
public VariableValues getVariableValues(WorkflowInstanceId workflowInstanceId, String activityInstanceId) {
log.debug("getVariableValues");
VariableValues variableValues = workflowEngine.getVariableValues(workflowInstanceId, activityInstanceId);
variableValues = wireize(" <<variableValues<< ", variableValues);
return variableValues;
}
@Override
public void setVariableValues(WorkflowInstanceId workflowInstanceId, VariableValues variableValues) {
log.debug("setVariableValues");
variableValues = wireize(" >>variableValues>> ", variableValues);
workflowEngine.setVariableValues(workflowInstanceId, null, variableValues);
}
@Override
public void setVariableValues(WorkflowInstanceId workflowInstanceId, String activityInstanceId, VariableValues variableValues) {
log.debug("setVariableValues");
variableValues = wireize(" >>variableValues>> ", variableValues);
workflowEngine.setVariableValues(workflowInstanceId, activityInstanceId, variableValues);
}
@Override
public List<WorkflowInstance> findWorkflowInstances(WorkflowInstanceQuery query) {
log.debug("findWorkflowInstances");
query = wireize(" >>query>>", query);
List<WorkflowInstance> workflowInstances = workflowEngine.findWorkflowInstances(query);
if (workflowInstances==null) {
return null;
}
List<WorkflowInstance> wirizedWorkflowInstances = new ArrayList<>(workflowInstances.size());
for (WorkflowInstance workflowInstance: workflowInstances) {
workflowInstance = wireize(" <-workflowInstance-", workflowInstance);
wirizedWorkflowInstances.add(workflowInstance);
}
return wirizedWorkflowInstances;
}
@Override
public void deleteWorkflowInstances(WorkflowInstanceQuery query) {
log.debug("deleteWorkflowInstances");
query = wireize(" >>query>>", query);
workflowEngine.deleteWorkflowInstances(query);
}
@Override
public WorkflowInstance cancel(WorkflowInstanceId workflowInstanceId) {
log.debug("cancel");
WorkflowInstance workflowInstance = workflowEngine.cancel(workflowInstanceId);
workflowInstance = wireize(" <<workflowInstance<< ", workflowInstance);
return workflowInstance;
}
}