com.heliosphere.demeter.base.runner.processor.AbstractProcessor.java Source code

Java tutorial

Introduction

Here is the source code for com.heliosphere.demeter.base.runner.processor.AbstractProcessor.java

Source

/*
 * Copyright(c) 2017 - Heliosphere Corp.
 * ---------------------------------------------------------------------------
 * This file is part of the Heliosphere's project which is licensed under the 
 * Apache license version 2 and use is subject to license terms.
 * You should have received a copy of the license with the project's artifact
 * binaries and/or sources.
 * 
 * License can be consulted at http://www.apache.org/licenses/LICENSE-2.0
 * ---------------------------------------------------------------------------
 */
package com.heliosphere.demeter.base.runner.processor;

import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.List;

import com.google.common.base.Stopwatch;
import com.heliosphere.demeter.base.element.Element;
import com.heliosphere.demeter.base.runner.context.IContext;
import com.heliosphere.demeter.base.runner.result.ExecutionResult;
import com.heliosphere.demeter.base.runner.result.ExecutionStatusType;
import com.heliosphere.demeter.base.runner.result.IExecutionResult;

import lombok.NonNull;

public class AbstractProcessor extends Element<String> implements IProcessor {
    /**
     * Processor execution result object.
     */
    private IExecutionResult result;

    /**
     * Processor context.
     */
    private IContext context;

    /**
     * Processor watch to measure elapsed time of processing.
     */
    private Stopwatch watch = null;

    /**
     * Collection of processor listeners.
     */
    private List<IProcessorListener> listeners = new ArrayList<>();

    /**
     * Creates a new abstract processor given its name.
     * <hr>
     * @param name Processor name.
     */
    public AbstractProcessor(@NonNull final String name) {
        super(name);
    }

    /**
     * Creates a new abstract processor given a context.
     * <hr>
     * @param context Context to process.
     */
    public AbstractProcessor(final IContext context) {
        super(context.getEntity().getName());

        this.context = context;
        setName(context.getEntity().getName());
        result = new ExecutionResult(getName());
        result.setParameters(context.getParameters());
        watch = Stopwatch.createStarted();
    }

    @Override
    public IExecutionResult call() throws Exception {
        try {
            result.setStatus(ExecutionStatusType.RUNNING);

            try {
                process();
                result.setStatus(ExecutionStatusType.SUCESSS);
            } catch (ConcurrentModificationException e) {
                result.setStatus(ExecutionStatusType.FAILED);
                e.printStackTrace();
            }
        } catch (ProcessorException e) {
            result.getExceptions().add(e);
            result.setStatus(ExecutionStatusType.FAILED);
        } finally {
            //result.setThreadName(Thread.currentThread().getName());
            //result.setParameters(getContext().getParameters());
            watch.stop();
            result.setElapsed(watch.toString());
        }

        return result;
    }

    @Override
    public final void addProcessorListener(@NonNull final IProcessorListener listener) {
        if (listeners != null) {
            listeners = new ArrayList<>();
        }

        if (!listeners.contains(listener)) {
            listeners.add(listener);
        }
    }

    @Override
    public final void removeProcessorListener(@NonNull final IProcessorListener listener) {
        if (listeners != null) {
            listeners.remove(listener);
        }
    }

    @Override
    public final void clearListeners() {
        listeners.clear();
        listeners = null;
    }

    @Override
    public void initialize() throws ProcessorException {
        // To be overridden by sub classes!
    }

    @Override
    public void process() throws ProcessorException {
        // To be overridden by sub classes!
    }

    @Override
    public final IContext getContext() {
        return context;
    }

    @Override
    public void setContext(@NonNull final IContext context) {
        this.context = context;
    }

    @Override
    public final IExecutionResult getExecutionResult() {
        return result;
    }
}