view src/main/java/christie/codegear/CodeGear.java @ 196:ad49723367c2

add priority
author akahori
date Sat, 09 Mar 2019 14:03:06 +0900
parents 2886363f5e12
children ef5aad739292
line wrap: on
line source

package christie.codegear;

import christie.annotation.Peek;
import christie.annotation.PeekFrom;
import christie.annotation.Take;
import christie.annotation.TakeFrom;
import christie.datagear.*;
import christie.datagear.command.Command;
import christie.datagear.command.PeekCommand;
import christie.datagear.command.TakeCommand;
import christie.datagear.dg.DataGear;

import java.lang.reflect.Field;
import java.util.ArrayList;

/**
 * Created by e125769 on 12/7/17.
 * Annotationからのinputコマンドの生成、揃ったDataGearの値を返す
 */
public abstract class CodeGear{
    private InputDataGear idg = new InputDataGear(this);
    private ArrayList<Command> commandList = new ArrayList<Command>();
    private CodeGearManager cgm;
    private DataGearManager localDGM;
    private CodeGearExecutor cge;

    protected abstract void run(CodeGearManager cgm);

    public void setup(CodeGearManager cgm, int priority){
        this.cgm = cgm;
        this.cge = new CodeGearExecutor(this, this.cgm, priority);
        this.localDGM = cgm.getLocalDGM();

        for (Field field : this.getClass().getDeclaredFields()) {//AnnotationからInputDataGearをセット
            if (field.isAnnotationPresent(Take.class)) {
                //Take ano = field.getAnnotation(Take.class);
                setTakeCommand("local", field.getName(), new DataGear(field.getType()));
            } else if (field.isAnnotationPresent(Peek.class)) {
                //Peek ano = field.getAnnotation(Peek.class);
                setPeekCommand("local", field.getName(), new DataGear(field.getType()));
            } else if (field.isAnnotationPresent(TakeFrom.class)) {
                TakeFrom ano = field.getAnnotation(TakeFrom.class);
                setTakeCommand(ano.value(), field.getName(), new DataGear(field.getType()));
            } else if (field.isAnnotationPresent(PeekFrom.class)) {
                PeekFrom ano = field.getAnnotation(PeekFrom.class);
                setPeekCommand(ano.value(), field.getName(), new DataGear(field.getType()));
            }
        }

        idg.finishInput(cgm, commandList);
    }

    public void setTakeCommand(String toDgmName, String key, DataGear dg){
        commandList.add(new TakeCommand(this, cgm.cgmID, toDgmName, key, dg));
    }

    public void setPeekCommand(String toDgmName, String key, DataGear dg){
        commandList.add(new PeekCommand(this, cgm.cgmID, toDgmName, key, dg));
    }

    public DataGearManager getLocalDGM() {
        return localDGM;
    }

    public DataGearManager getDGM(String dgmName) {
        return cgm.getDGM(dgmName);
    }

    public CodeGear put(String dgmName, String key, Object data){
        getDGM(dgmName).put(key, data);
        return this;
    }

    public CodeGear put(String key, Object value){

        localDGM.put(key, value);
        return this;
    }

    public Boolean containsDGM(String dgmName){ return cgm.containsDGM(dgmName);}

    public void finish(String managerKey) {
        if (cgm.getDGMList().contains(managerKey))
            cgm.getDGMList().get(managerKey).finish();
    }



    public void flip(String dgmName, String key){//ToDo: これ値を編集できるからflipできてない。初期値をflipしたい。
        for (Field field : this.getClass().getDeclaredFields()) {
            if (field.getName() == key){
                try {
                    getDGM(dgmName).put(key, field.get(this));
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public InputDataGear getIdg() {
        return idg;
    }

    public CodeGearExecutor getCge() {
        return cge;
    }

}