view src/main/java/christie/daemon/IncomingTcpConnection.java @ 272:b592fe1d4a4e default tip

create example Attendance
author matac42 <matac@cr.ie.u-ryukyu.ac.jp>
date Thu, 01 Jul 2021 20:41:07 +0900
parents 3bddbfd6ea02
children
line wrap: on
line source

package christie.daemon;


import christie.codegear.CodeGearManager;
import christie.datagear.*;

import christie.datagear.command.*;
import christie.datagear.RemoteMessage;
import christie.datagear.dg.MessagePackDataGear;
import org.msgpack.MessagePack;
import org.msgpack.unpacker.Unpacker;

import java.io.EOFException;
import java.io.IOException;
import java.nio.channels.ClosedChannelException;

public class IncomingTcpConnection extends Thread {

    RemoteDataGearManager manager;
    CodeGearManager cgm;
    Connection connection;
    private MessagePack packer = new MessagePack();

    public IncomingTcpConnection(Connection connection) {
        this.connection = connection;
        this.cgm = connection.cgm;
    }

    public void setManager(RemoteDataGearManager manager){
        this.manager = manager;
    }

    public void run() {
        Unpacker unpacker = null;
        try {
            unpacker = packer.createUnpacker(connection.socket.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (unpacker == null) {
            return;
        }
        while (true) {
            try {
                RemoteMessage msg = unpacker.read(RemoteMessage.class);
                CommandType type = CommandType.getCommandTypeFromId(msg.type);
                //System.out.println("read " + msg.key);
                byte[] data;

                switch (type) {
                    case PUT:
                        data = new byte[unpacker.readInt()];
                        connection.socket.getInputStream().read(data);

                        try {
                            MessagePackDataGear dg = new MessagePackDataGear(data, Class.forName(msg.clazz));
                            //System.out.println(Class.forName(msg.clazz));
                            cgm.getLocalDGM().put(msg.key, dg);

                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        }

                        break;

                    case REMOTEPEEK:
                    case REMOTETAKE:
                        try {
                            Command cm = new CommandBuilder().init(type).fromDgmName(msg.fromDgmName)
                                    .key(msg.key)
                                    .clazz(Class.forName(msg.clazz))
                                    .connection(connection).build();
                            cgm.getLocalDGM().runCommand(cm);

                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        }

                        break;
                    case REPLY://待っていたwaitListに渡してcsにセット
                        data = new byte[unpacker.readInt()];
                        connection.socket.getInputStream().read(data);

                        try {
                            MessagePackDataGear dg = new MessagePackDataGear(data, Class.forName(msg.clazz));
                            cgm.getDGM(msg.fromDgmName).resolveWaitCommand(msg.key, dg);
                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        }

                        break;
                    default:
                        break;
                }
            } catch (ClosedChannelException e) {
                return;
            }catch (EOFException e) {
                return;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


}