All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.taskurotta.service.storage.MemoryProcessService Maven / Gradle / Ivy

package ru.taskurotta.service.storage;

import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import ru.taskurotta.service.common.ResultSetCursor;
import ru.taskurotta.service.console.model.GenericPage;
import ru.taskurotta.service.console.model.Process;
import ru.taskurotta.service.console.retriever.ProcessInfoRetriever;
import ru.taskurotta.service.console.retriever.command.ProcessSearchCommand;
import ru.taskurotta.transport.model.TaskContainer;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

/**
 * User: romario
 * Date: 4/2/13
 * Time: 8:02 PM
 */
public class MemoryProcessService implements ProcessService, ProcessInfoRetriever {

    private Map processesStorage = new ConcurrentHashMap<>();

    @Override
    public void startProcess(TaskContainer task) {
        Process process = new Process(task);
        processesStorage.put(process.getProcessId(), process);
    }

    @Override
    public void finishProcess(UUID processId, String returnValue) {
        Process process = processesStorage.get(processId);
        process.setEndTime(System.currentTimeMillis());
        process.setState(Process.FINISH);
        process.setReturnValue(returnValue);
        processesStorage.put(processId, process);
    }

    @Override
    public void deleteProcess(UUID processId) {
        processesStorage.remove(processId);
    }

    @Override
    public Process getProcess(UUID processUUID) {
        return processesStorage.get(processUUID);
    }

    @Override
    public ResultSetCursor findProcesses(long recoveryTime, int limit) {
        return new ResultSetCursor() {
            @Override
            public Collection getNext() {
                return Collections.EMPTY_LIST;
            }

            @Override
            public void close() throws IOException {
            }
        };
    }

    @Override
    public TaskContainer getStartTask(UUID processId) {
        return processesStorage.get(processId).getStartTask();
    }

    @Override
    public void markProcessAsBroken(UUID processId) {
        setProcessState(processId, Process.BROKEN);
    }

    @Override
    public void markProcessAsStarted(UUID processId) {
        setProcessState(processId, Process.START);
    }

    public void setProcessState(UUID processId, int state) {
        Process process = processesStorage.get(processId);
        process.setState(state);
        processesStorage.put(processId, process);
    }

    @Override
    public GenericPage listProcesses(int pageNumber, int pageSize, final int status, final String typeFilter) {
        List result = new ArrayList<>();
        Collection values = null;
        if (!processesStorage.isEmpty()) {

            if (status >= 0 || typeFilter!=null) {
                values = Collections2.filter(processesStorage.values(), new Predicate() {
                    @Override
                    public boolean apply(Process input) {
                        boolean result = false;
                        if (input != null) {
                            result = status>=0? (input.getState() == status): true;
                            if (result && typeFilter != null) {
                                String actorType = input.getStartTask()!=null? input.getStartTask().getActorId(): null;
                                result = actorType!=null && actorType.startsWith(typeFilter);
                            }
                        }
                        return result;
                    }
                });
            } else {
                values = processesStorage.values();
            }

            if (values!=null && !values.isEmpty()) {
                int pageStart = (pageNumber - 1) * pageSize;
                int pageEnd = Math.min(pageSize * pageNumber, values.size());
                result.addAll(new ArrayList<>(values).subList(pageStart, pageEnd));
            }
        }

        return new GenericPage<>(result, pageNumber, pageSize, values!=null? values.size(): 0);
    }

    @Override
    public List findProcesses(final ProcessSearchCommand command) {
        List result = new ArrayList<>();
        if (command.getCustomId()!=null || command.getProcessId()!=null ) {
            result.addAll(Collections2.filter(processesStorage.values(), new Predicate() {

                private boolean hasText(String target){
                    return target != null && target.trim().length()>0;
                }

                private boolean isValid (Process process) {
                    boolean isValid = true;
                    if (hasText(command.getCustomId())) {
                        isValid = process.getProcessId().toString().startsWith(command.getCustomId());
                    }
                    if (hasText(command.getProcessId())) {
                        isValid = isValid && process.getProcessId().toString().startsWith(command.getProcessId());
                    }
                    return isValid;
                }

                @Override
                public boolean apply(Process process) {
                    return isValid(process);
                }

            }));
        }
        return result;
    }

    @Override
    public int getFinishedCount(String customId) {
        int result = 0;
        Iterator iterator = processesStorage.values().iterator();
        while (iterator.hasNext()) {
            Process process = iterator.next();
            if (process.getState() == Process.FINISH) {
                if (customId == null || customId.equals(process.getCustomId())) {
                    result++;
                }

            }
        }
        return result;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy