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

add priority
author akahori
date Sat, 09 Mar 2019 14:03:06 +0900
parents 7b405f622c5c
children e486c13d9ea9
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.DataGears;
import christie.datagear.command.Command;
import christie.datagear.dg.DataGear;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by e125769 on 12/7/17.
 * inputDataGearの待ち合わせの管理
 */
public class InputDataGear {
    public DataGears dataGears;
    public ConcurrentHashMap<String, DataGear> inputValue = new ConcurrentHashMap<String, DataGear>();//受け皿
    public CodeGearManager cgm;
    public CodeGear cg;
    private AtomicInteger count = new AtomicInteger(0);

    public InputDataGear(CodeGear cg){
        this.cg = cg;
    }

    void finishInput(CodeGearManager cgm, ArrayList<Command> commandList){
        this.cgm = cgm;
        count = new AtomicInteger(commandList.size());

        if(count.get() == 0){
            submitCG();
        }

        for(Command cm : commandList){
            cgm.getDGM(cm.toDgmName).runCommand(cm);
        }
    }

    public void setInputs(String key, DataGear dg){
        inputValue.put(key, dg);
        decriment();
    }

    public synchronized void decriment(){//Commandが実行されるたびにデクリメント
        if (count.decrementAndGet() == 0){
            setInputValue();
            submitCG();
        }
    }

    void submitCG(){
        cgm.submit(cg);
    }

    public void setInputValue(){//Annotationから揃ったInputDataGearの値をキャスト
        for (Field field : cg.getClass().getDeclaredFields()) {
            field.setAccessible(true);
            if (field.isAnnotationPresent(Take.class) || field.isAnnotationPresent(TakeFrom.class) ||
                    field.isAnnotationPresent(Peek.class) || field.isAnnotationPresent(PeekFrom.class)){
                try {
                    field.set(cg, typeCheck(field.getName()));
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public Object typeCheck(String key){
        if (inputValue.get(key).getData() != null){
            return inputValue.get(key).getData();
        } else {
            throw new IllegalArgumentException("'" + key + "' is null! this DataGear required type of " + inputValue.get(key).getClazz());
        }
    }

}