view src/main/java/christie/codegear/CodeGear.java @ 221:7e5f18a5e612

add RemoteEditor & TextEditor
author ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
date Tue, 19 Nov 2019 16:51:26 +0900
parents 3bddbfd6ea02
children
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.*;
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){
        setup(cgm, Thread.NORM_PRIORITY);
    }

    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);
                setCommand(CommandType.TAKE, "local", field.getName(), new DataGear(field.getType()));
            } else if (field.isAnnotationPresent(Peek.class)) {
                //Peek ano = field.getAnnotation(Peek.class);
                setCommand(CommandType.PEEK,"local", field.getName(), new DataGear(field.getType()));
            } else if (field.isAnnotationPresent(TakeFrom.class)) {
                TakeFrom ano = field.getAnnotation(TakeFrom.class);
                setCommand(CommandType.TAKE, ano.value(), field.getName(), new DataGear(field.getType()));
            } else if (field.isAnnotationPresent(PeekFrom.class)) {
                PeekFrom ano = field.getAnnotation(PeekFrom.class);
                setCommand(CommandType.PEEK,ano.value(), field.getName(), new DataGear(field.getType()));
            }
        }

        idg.finishInput(cgm, commandList);
    }

    public void setCommand(CommandType type, String toDgmName, String key, DataGear dg){
        Command command = new CommandBuilder().init(type).cg(this)
                                                         .cgmID(cgm.cgmID)
                                                         .toDgmName(toDgmName)
                                                           .key(key)
                                                         .dg(dg)
                                                         .build();
        commandList.add(command);
    }

    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;
    }

}