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

de.tsl2.nano.repeat.impl.MacroRecorder Maven / Gradle / Ivy

package de.tsl2.nano.repeat.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Deque;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.LinkedBlockingDeque;

import de.tsl2.nano.bean.BeanUtil;
import de.tsl2.nano.repeat.ICommand;
import de.tsl2.nano.repeat.IMacroManager;

/**
 * Simple implementation of {@link IMacroManager}
 * 
 * @param 
 * @author Tom, Thomas Schneider
 * @version $Revision$
 */
public class MacroRecorder implements IMacroManager {
    Map>> macros;
    String recordingID;

    public MacroRecorder() {
        this(Integer.MAX_VALUE);
    }

    /**
     * constructor
     */
    public MacroRecorder(int capacity) {
        super();
        macros = new HashMap>>();
    }

    @Override
    public void record(String id, ICommand... m) {
        if (recordingID == null) {
            if (id == null) {
                throw new IllegalStateException(
                    "please call 'record' with a filled 'id' to start the recording process!");
            }
            recordingID = id;
        }
        macro().addAll(copy(m));
    }

    private Collection> copy(ICommand[] m) {
        List> copy = new ArrayList>();
        for (int i = 0; i < m.length; i++) {
            copy.add(BeanUtil.copy(m[i]));
        }
        return copy;
    }

    private Deque> macro() {
        return macro(recordingID);
    }

    /**
     * macro
     * 
     * @return the current macro (the last record...if not stopped!)
     */
    private Deque> macro(String recordingID) {
        Deque> m = macros.get(recordingID);
        if (m == null) {
            m = new LinkedBlockingDeque>();
            macros.put(recordingID, m);
        }
        return m;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isRecording() {
        return recordingID != null;
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    @Override
    public int play(String id, CONTEXT context) {
        if (isRecording()) {
            throw new IllegalStateException("please stop macro recording first!");
        }
        Deque> m = macro(id);
        int size = m.size();
        for (ICommand cmd : m) {
            cmd.setContext(context);
            cmd.run();
        }
        return size;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int stop() {
        int size = macro().size();
        recordingID = null;
        return size;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy