com.effektif.workflow.impl.memory.MemoryWorkflowStore.java Source code

Java tutorial

Introduction

Here is the source code for com.effektif.workflow.impl.memory.MemoryWorkflowStore.java

Source

/*
 * 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.impl.memory;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

import org.joda.time.LocalDateTime;

import com.effektif.workflow.api.model.WorkflowId;
import com.effektif.workflow.api.query.WorkflowQuery;
import com.effektif.workflow.api.workflow.ExecutableWorkflow;
import com.effektif.workflow.impl.WorkflowStore;
import com.effektif.workflow.impl.configuration.Brewable;
import com.effektif.workflow.impl.configuration.Brewery;

/**
 * @author Tom Baeyens
 */
public class MemoryWorkflowStore implements WorkflowStore, Brewable {

    protected Map<WorkflowId, ExecutableWorkflow> workflows;

    public MemoryWorkflowStore() {
    }

    @Override
    public void brew(Brewery brewery) {
        initializeWorkflows();
    }

    protected void initializeWorkflows() {
        this.workflows = new ConcurrentHashMap<>();
    }

    @Override
    public WorkflowId generateWorkflowId() {
        return new WorkflowId(UUID.randomUUID().toString());
    }

    @Override
    public void insertWorkflow(ExecutableWorkflow workflow) {
        workflows.put(workflow.getId(), workflow);
    }

    @Override
    public List<ExecutableWorkflow> findWorkflows(WorkflowQuery query) {
        if (query == null) {
            query = new WorkflowQuery();
        }
        List<ExecutableWorkflow> result = new ArrayList<>();
        if (query.getWorkflowId() != null) {
            ExecutableWorkflow workflow = workflows.get(query.getWorkflowId());
            if (workflow != null) {
                result.add(workflow);
            }
        } else {
            result = new ArrayList<>(workflows.values());
        }
        if (query.getWorkflowSource() != null && !result.isEmpty()) {
            filterByName(result, query.getWorkflowSource());
        }
        if (query.getLimit() != null) {
            while (result.size() > query.getLimit()) {
                result.remove(result.size() - 1);
            }
        }
        return result;
    }

    protected void filterByName(List<ExecutableWorkflow> result, String name) {
        for (int i = result.size() - 1; i >= 0; i--) {
            if (!name.equals(result.get(i).getSourceWorkflowId())) {
                result.remove(i);
            }
        }
    }

    @Override
    public WorkflowId findLatestWorkflowIdBySource(String workflowName) {
        if (workflowName == null) {
            return null;
        }
        ExecutableWorkflow latestWorkflow = null;
        LocalDateTime latestDeployTime = null;
        for (ExecutableWorkflow workflow : workflows.values()) {
            if (workflowName.equals(workflow.getSourceWorkflowId())
                    && (latestDeployTime == null || latestDeployTime.isAfter(workflow.getCreateTime()))) {
                latestWorkflow = workflow;
                latestDeployTime = workflow.getCreateTime();
            }
        }
        return latestWorkflow != null ? latestWorkflow.getId() : null;
    }

    @Override
    public void deleteWorkflows(WorkflowQuery query) {
        for (ExecutableWorkflow workflow : findWorkflows(query)) {
            workflows.remove(workflow.getId());
        }
    }

    @Override
    public void deleteAllWorkflows() {
        initializeWorkflows();
    }

    @Override
    public ExecutableWorkflow loadWorkflowById(WorkflowId workflowId) {
        return workflows.get(workflowId);
    }
}