view src/main/java/alice/codesegment/CodeSegment.java @ 647:e321c5ec9b58

fix toplogy manager; ring worked
author suruga
date Sun, 31 Dec 2017 19:32:27 +0900
parents 3e00000949aa
children
line wrap: on
line source

package alice.codesegment;

import java.io.IOException;
import java.lang.reflect.*;
import java.util.ArrayList;
import java.util.HashMap;

import alice.Annotation.MetaReceiver;
import alice.Annotation.Peek;
import alice.Annotation.Take;
import alice.codesegment.InputDataSegment;
import alice.datasegment.CommandType;
import alice.datasegment.Receiver;
import javassist.*;
import javassist.compiler.ast.Pair;
import javassist.tools.reflect.Sample;
//import sun.jvm.hotspot.oops.Instance;

public abstract class CodeSegment implements Runnable {

    public InputDataSegment ids = new InputDataSegment(this);
    public OutputDataSegment ods = new OutputDataSegment();
    private ArrayList<Receiver> list = new ArrayList<Receiver>();//Receivers of after setKey
    private int priority = Thread.NORM_PRIORITY;//?
    private  ArrayList<MetaReceiver> receivers = new ArrayList<MetaReceiver>();//all Receivers
    private Field[] fields;

    public CodeSegment() {
        createReceiver();
        setKey();
    }

    public void createReceiver() {
        this.fields = this.getClass().getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(Take.class)) {
                receivers.add(new MetaReceiver(field.getType(), ids.create(CommandType.TAKE)));
            }
            else if (field.isAnnotationPresent(Peek.class)) {
                receivers.add(new MetaReceiver(field.getType(), ids.create(CommandType.PEEK)));
            }
        }
    }

    public void setKey() {
        int i = 0;
        for (Field field : fields) {
            if (field.isAnnotationPresent(Take.class)) {
                Take ano = field.getAnnotation(Take.class);
                receivers.get(i).getReceiver().setKey(ano.value());
                i++;
            }
            else if (field.isAnnotationPresent(Peek.class)) {
                Peek ano = field.getAnnotation(Peek.class);
                receivers.get(i).getReceiver().setKey(ano.value());
                i++;
            }
        }
    }

    public void setValue() {
        int i = 0;
        for (Field field : fields){
            if (field.isAnnotationPresent(Take.class) || field.isAnnotationPresent(Peek.class)) {
                field.setAccessible(true);
                try {
                    field.set(this, receivers.get(i).asClass());
                    i++;
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void execute() {
        ids.receive();
    }

    public void register(Receiver receiver) {
        list.add(receiver);
    }//Receiverを作成?

    public void recycle(){//idsのリセット
        ids.init();
        ids.setCounter(list.size());
        for (Receiver receiver : list) {
            receiver.index = 0;
            ids.recommand(receiver);
        }
    }

    public int getPriority() {
        return priority;
    }

    public void setPriority(int priority) {
        this.priority = priority;
    }

}