Skip to content
Snippets Groups Projects
SuperVisorImpl.java 3.63 KiB
Newer Older
Michael Kmoch's avatar
Michael Kmoch committed
package fucoin.supervisor;

import akka.actor.Props;
Michael Kmoch's avatar
Michael Kmoch committed
import fucoin.actions.Action;
import fucoin.actions.persist.ActionInvokeUpdate;
import fucoin.actions.transaction.ActionGetAmountAnswer;
import fucoin.actions.transaction.SuperVisorAction;
import fucoin.gui.SuperVisorGuiControl;
import fucoin.AbstractNode;
Michael Kmoch's avatar
Michael Kmoch committed

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class SuperVisorImpl extends AbstractNode {
    private AmountTableModel amountTableModel;

    private Map<Long, DistributedCommittedTransferRequest> requestQueue;

    private SuperVisorGuiControl gui;

    public SuperVisorImpl() {
        this.amountTableModel = new AmountTableModel();
    }

    public void setGuiControl(SuperVisorGuiControl gui) {
        this.gui = gui;
    }

    public SuperVisorImpl(AmountTableModel amountTableModel) {
        this.amountTableModel = amountTableModel;
    }

    @Override
    public void onReceive(Object msg) {

        // dirty but necessary since ActionGetAmountAnswer is a
        // ClientAction for some reason
        if (msg instanceof ActionGetAmountAnswer) {
            ActionGetAmountAnswer answer = (ActionGetAmountAnswer) msg;
            amountTableModel.updateTable(answer.address, answer.name, answer.amount);
        } /* TODO: Whats happened here?? Why we can invoke doAction of abstract class? */ else if (msg instanceof SuperVisorAction) {
            ((Action) msg).doAction(this);
        }
    }

    public static Props props() {
        return Props.create(new SuperVisorCreator());
    }

    public void updateValues() {
        getSelf().tell(new ActionInvokeUpdate(), getSelf());
    }

    public void exit() {
        getContext().stop(getSelf());
        if (gui != null) {
            gui.onLeave();
        }
    }

    @Override
    public void postStop() throws Exception {
        super.postStop();
    }

    public void addDistributedCommitedTransferRequest(
            DistributedCommittedTransferRequest request) {
        requestQueue.put(request.getId(), request);
    }

    @Override
    public void preStart() throws Exception {
        super.preStart();
        requestQueue = new HashMap<>();
        self().tell(new ActionUpdateQueue(), self());
    }

    /**
     * filters the request for outdated and removes them
     *
     * @return deleted outdated request
     */
    public List<DistributedCommittedTransferRequest> updateList() {
        List<Long> deletesIds = new ArrayList<>();
        List<DistributedCommittedTransferRequest> deletes = new ArrayList<>();
        for (Entry<Long, DistributedCommittedTransferRequest> outdatedRequest : requestQueue.entrySet()) {
            if (outdatedRequest.getValue().getTimeout() < System.currentTimeMillis()) {
                deletesIds.add(outdatedRequest.getKey());
                deletes.add(outdatedRequest.getValue());
            }
        }
        for (Long delete : deletesIds) {
            requestQueue.remove(delete);
        }

        return deletes;
    }

    public DistributedCommittedTransferRequest getRequest(Long id) {
        return requestQueue.get(id);
    public void deleteRequest(DistributedCommittedTransferRequest request) {
        requestQueue.remove(request.getId());
    }

    public AmountTableModel getAmountTableModel() {
        return amountTableModel;
    }

    public void setAmountTableModel(AmountTableModel amountTableModel) {
        this.amountTableModel = amountTableModel;
    }

    public void log(String message){
        if (this.gui != null){
            this.gui.log(message);
        } else {
            System.out.println(message);
        }
    }
Michael Kmoch's avatar
Michael Kmoch committed
}