view src/main/java/christie/codegear/CodeGear.java @ 32:307ac87ddcf7

add TakeFrom annotation
author Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
date Thu, 15 Feb 2018 15:48:23 +0900
parents e29900328fff
children 4479d37c8e53
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){
        this.cgm = cgm;
        this.cge = new CodeGearExecutor(this, this.cgm);
        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()));
            } 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 InputDataGear getIdg() {
        return idg;
    }

    public CodeGearExecutor getCge() {
        return cge;
    }
}