changeset 218:30f3525e8b15

マージ
author ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
date Fri, 15 Mar 2019 18:01:06 +0900
parents 5647450a26ca (current diff) 176d0b94c1c5 (diff)
children 6cbf93a11d24
files
diffstat 23 files changed, 323 insertions(+), 183 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/christie/codegear/CodeGear.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/codegear/CodeGear.java	Fri Mar 15 18:01:06 2019 +0900
@@ -5,9 +5,7 @@
 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.command.*;
 import christie.datagear.dg.DataGear;
 
 import java.lang.reflect.Field;
@@ -24,8 +22,13 @@
     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);
@@ -34,28 +37,30 @@
         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()));
+                setCommand(CommandType.TAKE, "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()));
+                setCommand(CommandType.PEEK,"local", field.getName(), new DataGear(field.getType()));
             } else if (field.isAnnotationPresent(TakeFrom.class)) {
                 TakeFrom ano = field.getAnnotation(TakeFrom.class);
-                setTakeCommand(ano.value(), field.getName(), new DataGear(field.getType()));
+                setCommand(CommandType.TAKE, 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()));
+                setCommand(CommandType.PEEK,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 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() {
--- a/src/main/java/christie/codegear/CodeGearManager.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/codegear/CodeGearManager.java	Fri Mar 15 18:01:06 2019 +0900
@@ -24,15 +24,13 @@
     public int localPort;
 
     public CodeGearManager(int cgmID, ThreadPoolExecutor exe, ConcurrentHashMap<Integer, CodeGearManager> cgmList, int localPort) {
-        dgmList.put("local", localDGM);
+        this.dgmList.put("local", localDGM);
         this.cgmList = cgmList;
-        threadPoolExecutor = exe;
+        this.threadPoolExecutor = exe;
         this.cgmID = cgmID;
         this.localPort = localPort;
-        daemon = new ChristieDaemon(localPort, this);
-        daemon.listen();
-
-
+        this.daemon = new ChristieDaemon(localPort, this);
+        this.daemon.listen();
     }
 
     public LocalDataGearManager getLocalDGM(){
@@ -55,7 +53,7 @@
     }
 
     public void submit(CodeGear cg){
-        threadPoolExecutor.execute(PriorityThreadPoolExecutors.PriorityRunnable.of(cg.getCge(), cg.getCge().getPriority()));
+        threadPoolExecutor.execute(cg.getCge());
     }
 
     public void setup(CodeGear cg){
--- a/src/main/java/christie/codegear/InputDataGear.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/codegear/InputDataGear.java	Fri Mar 15 18:01:06 2019 +0900
@@ -18,7 +18,6 @@
  * inputDataGearの待ち合わせの管理
  */
 public class InputDataGear {
-    public DataGears dataGears;
     public ConcurrentHashMap<String, DataGear> inputValue = new ConcurrentHashMap<String, DataGear>();//受け皿
     public CodeGearManager cgm;
     public CodeGear cg;
--- a/src/main/java/christie/codegear/PriorityThreadPoolExecutors.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/codegear/PriorityThreadPoolExecutors.java	Fri Mar 15 18:01:06 2019 +0900
@@ -32,24 +32,19 @@
         }
 
         private Runnable newComparableRunnableFor(Runnable runnable) {
-            return new ComparableRunnable(ensurePriorityRunnable(runnable));
+            return new ComparableRunnable((CodeGearExecutor) runnable);
         }
 
         @Override
         protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
-            return new ComparableFutureTask<>(ensurePriorityRunnable(runnable), value);
-        }
-
-        private PriorityRunnable ensurePriorityRunnable(Runnable runnable) {
-            return (runnable instanceof PriorityRunnable) ? (PriorityRunnable) runnable
-                    : PriorityRunnable.of(runnable, DEFAULT_PRIORITY);
+            return new ComparableFutureTask<>((CodeGearExecutor)runnable, value);
         }
 
         private class ComparableFutureTask<T> extends FutureTask<T> implements ComparableTask {
             private Long sequentialOrder = instanceCounter.getAndIncrement();
-            private HasPriority hasPriority;
+            private CodeGearExecutor hasPriority;
 
-            public ComparableFutureTask(PriorityRunnable priorityRunnable, T result) {
+            public ComparableFutureTask(CodeGearExecutor priorityRunnable, T result) {
                 super(priorityRunnable, result);
                 this.hasPriority = priorityRunnable;
             }
@@ -67,12 +62,10 @@
 
         private static class ComparableRunnable implements Runnable, ComparableTask {
             private Long instanceCount = instanceCounter.getAndIncrement();
-            private HasPriority hasPriority;
-            private Runnable runnable;
+            private CodeGearExecutor runnable;
 
-            public ComparableRunnable(PriorityRunnable priorityRunnable) {
+            public ComparableRunnable(CodeGearExecutor priorityRunnable) {
                 this.runnable = priorityRunnable;
-                this.hasPriority = priorityRunnable;
             }
 
             @Override
@@ -82,7 +75,7 @@
 
             @Override
             public int getPriority() {
-                return hasPriority.getPriority();
+                return runnable.getPriority();
             }
 
             @Override
@@ -108,26 +101,4 @@
 
     }
 
-    public interface HasPriority{
-        int getPriority();
-    }
-
-
-    public interface PriorityRunnable extends Runnable, HasPriority{
-
-        public static PriorityRunnable of(Runnable runnable, int priority) {
-            return new PriorityRunnable() {
-                @Override
-                public void run() {
-                    runnable.run();
-                }
-
-                @Override
-                public int getPriority() {
-                    return priority;
-                }
-            };
-        }
-    }
-
 }
\ No newline at end of file
--- a/src/main/java/christie/codegear/StartCodeGear.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/codegear/StartCodeGear.java	Fri Mar 15 18:01:06 2019 +0900
@@ -7,17 +7,19 @@
 
 public abstract class StartCodeGear extends CodeGear{
     static ConcurrentHashMap<Integer, CodeGearManager> cgmList = new ConcurrentHashMap<>();
-    //static LinkedBlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<Runnable>();
-    /*static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), // initial number of threads
+    /*static LinkedBlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<Runnable>();
+    static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), // initial number of threads
             Runtime.getRuntime().availableProcessors(),
             Integer.MAX_VALUE, // keepAliveTime
             TimeUnit.SECONDS,
             taskQueue);*/
-    static ThreadPoolExecutor threadPoolExecutor = PriorityThreadPoolExecutors.createThreadPool(Runtime.getRuntime().availableProcessors(), Integer.MAX_VALUE);
+    static ThreadPoolExecutor threadPoolExecutor = PriorityThreadPoolExecutors.createThreadPool(Runtime.getRuntime().availableProcessors(),
+            Integer.MAX_VALUE);
     static int cgmCount = 1;
 
     public StartCodeGear(CodeGearManager cgm){
         cgm.setup(this);
+
     }
 
     public static CodeGearManager createCGM(int localPort){
@@ -33,5 +35,4 @@
     @Override
     protected void run(CodeGearManager cgm) {}
 
-
 }
--- a/src/main/java/christie/daemon/IncomingTcpConnection.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/daemon/IncomingTcpConnection.java	Fri Mar 15 18:01:06 2019 +0900
@@ -4,10 +4,8 @@
 import christie.codegear.CodeGearManager;
 import christie.datagear.*;
 
-import christie.datagear.command.CommandType;
+import christie.datagear.command.*;
 import christie.datagear.RemoteMessage;
-import christie.datagear.command.RemotePeekCommand;
-import christie.datagear.command.RemoteTakeCommand;
 import christie.datagear.dg.MessagePackDataGear;
 import org.msgpack.MessagePack;
 import org.msgpack.unpacker.Unpacker;
@@ -53,9 +51,12 @@
                     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();
                         }
@@ -63,14 +64,17 @@
                         break;
 
                     case REMOTEPEEK:
+                    case REMOTETAKE:
                         try {
-                            cgm.getLocalDGM().runCommand(new RemotePeekCommand(msg, connection));
+                            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 REMOTETAKE:
-                        cgm.getLocalDGM().runCommand(new RemoteTakeCommand(msg, connection));
 
                         break;
                     case REPLY://待っていたwaitListに渡してcsにセット
@@ -94,8 +98,6 @@
                 return;
             } catch (IOException e) {
                 e.printStackTrace();
-            } catch (ClassNotFoundException e) {
-                e.printStackTrace();
             }
         }
     }
--- a/src/main/java/christie/daemon/OutboundTcpConnection.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/daemon/OutboundTcpConnection.java	Fri Mar 15 18:01:06 2019 +0900
@@ -16,10 +16,8 @@
                 Command cmd = connection.sendQueue.take();
                 switch (cmd.type) {
                     case CLOSE:
-                        connection.close();
-                        return;
                     case FINISH:
-                        System.exit(0);
+                        cmd.execute();
                         return;
                     default:
                         break;
--- a/src/main/java/christie/datagear/DataGearManager.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/DataGearManager.java	Fri Mar 15 18:01:06 2019 +0900
@@ -1,6 +1,8 @@
 package christie.datagear;
 
+import christie.codegear.CodeGear;
 import christie.datagear.command.Command;
+import christie.datagear.command.CommandBuilder;
 import christie.datagear.dg.DataGear;
 
 /**
@@ -17,6 +19,4 @@
     public abstract void close();
     public abstract void shutdown();
 
-
-
 }
--- a/src/main/java/christie/datagear/DataGears.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/DataGears.java	Fri Mar 15 18:01:06 2019 +0900
@@ -1,5 +1,8 @@
 package christie.datagear;
 
+import christie.codegear.CodeGear;
+import christie.datagear.command.Command;
+import christie.datagear.command.CommandType;
 import christie.datagear.dg.DataGear;
 
 import java.util.TreeMap;
@@ -19,7 +22,7 @@
         }
     }
 
-    public synchronized Object take(String key){
+    public Object take(String key){
         Object data = dataGears.get(key).poll().getData();
 
         if (dataGears.get(key).isEmpty()) {
@@ -33,6 +36,23 @@
         return dataGears.get(key).peek().getData();
     }
 
+    public synchronized Object getData(Command cm){
+        switch (cm.type) {
+            case TAKE:
+            case REMOTETAKE:
+                return take(cm.key);
+            case PEEK:
+            case REMOTEPEEK:
+                return peek(cm.key);
+        }
+
+        return null;
+    }
+
+    public synchronized void setData(Command cm){
+        put(cm.key, cm.dg);
+    }
+
     public synchronized boolean containsKey(String key){
         return dataGears.containsKey(key);
     }
--- a/src/main/java/christie/datagear/LocalDataGearManager.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/LocalDataGearManager.java	Fri Mar 15 18:01:06 2019 +0900
@@ -3,6 +3,8 @@
 import christie.datagear.command.*;
 import christie.datagear.dg.DataGear;
 
+import static christie.datagear.command.CommandType.PUT;
+
 /**
  * Created by e125769 on 12/7/17.
  */
@@ -13,75 +15,52 @@
         put(key, dg);
     }
 
-    public void put(String key, DataGear dg){
-        runCommand(new PutCommand(1, "local", key, dg));
+    public void put(String key, DataGear dg) {
+        Command cm = new CommandBuilder().init(CommandType.PUT).cgmID(1)
+                                                               .toDgmName("local")
+                                                               .key(key)
+                                                               .dg(dg)
+                                                               .build();
+        runCommand(cm);
     }
 
     public void runCommand(Command cm){
         switch (cm.type) {
             case PUT:
-                dataGears.put(cm.key, cm.dg);
+                dataGears.setData(cm);
 
-                if (waitList.containsKey(cm.key)){//ここもsyncronized?
+                if (waitList.containsKey(cm.key)){
                     runCommand(waitList.getAndRemoveCommand(cm.key));
                 }
 
                 break;
             case TAKE:
+            case REMOTETAKE:
+            case PEEK:
+            case REMOTEPEEK:
                 if (dataGears.containsKey(cm.key)) {
-                    takeAndSetData(cm);
-                    cm.setInputs();
-                } else {
-                    waitList.add(cm);
-                }
-
-                break;
-            case REMOTETAKE:
-                if (dataGears.containsKey(cm.key)) {
-                    takeAndSetData(cm);
-                    runCommand(new ReplyCommand(cm));
+                    setData(cm);
+                    cm.execute();
                 } else {
                     waitList.add(cm);
                 }
-
-                break;
-            case PEEK:
-                if (dataGears.containsKey(cm.key)) {
-                    peekAndSetData(cm);
-                    cm.setInputs();
-                } else {
-                    waitList.add(cm);
-                }
-
-                break;
-            case REMOTEPEEK:
-                if (dataGears.containsKey(cm.key)) {
-                    peekAndSetData(cm);
-                    runCommand(new ReplyCommand(cm));
-                } else {
-                    waitList.add(cm);
-                }
-
                 break;
             case REPLY:
-                cm.connection.write(cm);
+                cm.execute();
                 break;
 
         }
     }
 
+    private void setData(Command cm){
+        cm.setDg(dataGears.getData(cm));
+    }
     @Override
     public void resolveWaitCommand(String key, DataGear dg) {
 
     }
 
-    private void takeAndSetData(Command cm){
-        cm.setDg(dataGears.take(cm.key));
-    }
 
-    private void peekAndSetData(Command cm){
-        cm.setDg(dataGears.peek(cm.key));
-    }
 
     @Override
     public void finish() {
--- a/src/main/java/christie/datagear/RemoteDataGearManager.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/RemoteDataGearManager.java	Fri Mar 15 18:01:06 2019 +0900
@@ -61,8 +61,9 @@
 
     @Override
     public void put(String key, Object data) {
-
-        Command cm = new PutCommand(0, null, key, new DataGear(data));
+        Command cm = new CommandBuilder().init(CommandType.PUT).key(key)
+                                         .dg(new DataGear(data))
+                                         .build();
         // これ入れないと, connectionがnullの時があるのでしょうがなくwait.
         // コンストラクタで呼び出されるThreadをやめて実効すればいんだけどね...
         if(!connect) connectWait();
@@ -73,35 +74,41 @@
     @Override
     public void runCommand(Command cm) {
         waitList.add(cm);
-        Command remoteCmd = null;
+        CommandType type = null;
         switch (cm.type) {
             case PEEK:
-                remoteCmd = new RemotePeekCommand(connection.name, cm, connection);
+                type = CommandType.REMOTEPEEK;
                 break;
             case TAKE:
-                remoteCmd = new RemoteTakeCommand(connection.name, cm, connection);
+                type = CommandType.REMOTETAKE;
                 break;
         }
+        Command remoteCmd = new CommandBuilder().init(type).fromDgmName(connection.name)
+                                                           .key(cm.key)
+                                                           .clazz(cm.clazz)
+                                                           .connection(connection)
+                                                           .build();
+
         connection.write(remoteCmd);
     }
 
     @Override
     public void resolveWaitCommand(String key, DataGear dg) {
         Command cm = waitList.getAndRemoveCommand(key);
-        cm.dg = dg;
-        cm.setInputs();
+        cm.setDg(dg);
+        cm.execute();
     }
 
 
     @Override
     public void finish() {
-        Command cmd = new FinishCommand();
+        Command cmd = new CommandBuilder().init(CommandType.FINISH).build();
         connection.sendCommand(cmd);
     }
 
     @Override
     public void close() {
-        Command cmd = new CloseCommand();
+        Command cmd = new CommandBuilder().init(CommandType.CLOSE).connection(connection).build();
         connection.sendCommand(cmd);
     }
 
--- a/src/main/java/christie/datagear/command/CloseCommand.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/command/CloseCommand.java	Fri Mar 15 18:01:06 2019 +0900
@@ -1,16 +1,23 @@
 package christie.datagear.command;
 
+import christie.daemon.Connection;
+
 import java.nio.ByteBuffer;
 
 public class CloseCommand extends Command {
-
+    public Connection connection = null;//for close
 
-    public CloseCommand() {
-        CommandType type = CommandType.CLOSE;
+    public CloseCommand(CommandBuilder cb) {
+        super(cb);
     }
 
     @Override
     public ByteBuffer convert() {
         return null;
     }
+
+    @Override
+    public void execute() {
+        connection.close();
+    }
 }
--- a/src/main/java/christie/datagear/command/Command.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/command/Command.java	Fri Mar 15 18:01:06 2019 +0900
@@ -3,36 +3,60 @@
 import christie.codegear.CodeGear;
 import christie.daemon.Connection;
 import christie.datagear.RemoteMessage;
-import christie.datagear.command.CommandType;
 import christie.datagear.dg.DataGear;
 
 import java.nio.ByteBuffer;
 
 public abstract class Command {
     public CommandType type;
-    public String key;
-    public String toDgmName;// for take
+    public String key = null;
+    public String toDgmName = null;// for take
     public String fromDgmName = "local";//for remotetake/reply
-    public int cgmID = 0;// for local meta
+    public Integer cgmID = -1;// for local meta
     public CodeGear cg = null;//for localtake
     public DataGear dg = null;//for put/localtake/reply
     public Class clazz = null;// for remote
     public Connection connection = null;//for reply
 
+
+    public Command(CommandBuilder cb){
+        this.type = cb.type;
+        this.key = cb.key;
+        this.toDgmName = cb.toDgmName;
+        this.fromDgmName = cb.fromDgmName;
+        this.cgmID = cb.cgmID;
+        this.cg = cb.cg;
+        this.dg = cb.dg;
+        this.clazz = cb.clazz;
+        this.connection = cb.connection;
+    }
+
+    // instead of any Constoractor args
+    protected void checkNeedParam(CommandBuilder cb){
+
+    }
+
+    public abstract void execute();
+    //public abstract void run(Object dataGear);
+
     //for remote
     public abstract ByteBuffer convert();
 
+
     //for remote
     public RemoteMessage createRemoteMessage(){
         return new RemoteMessage(type.id, fromDgmName, key, clazz.getName());
     }
 
-    public void setInputs(){
-        cg.getIdg().setInputs(key, dg);
+    public void setDg(Object obj){
+        this.dg.setData(obj);
     }
 
-    public void setDg(Object obj){
-        this.dg.setData(obj);
+    @Override
+    public String toString() {
+        return "Command : type = " + type + ", key = " + key + " toDgmName = " +
+                toDgmName + " fromDgmName = " + fromDgmName + " cgmID = " + cgmID
+                + " cg = " + cg + " dg = " + dg + " clazz = " + clazz + " coonection = " + connection ;
     }
 
     //public void removeInputs(){
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/christie/datagear/command/CommandBuilder.java	Fri Mar 15 18:01:06 2019 +0900
@@ -0,0 +1,126 @@
+package christie.datagear.command;
+
+import christie.codegear.CodeGear;
+import christie.daemon.Connection;
+import christie.datagear.dg.DataGear;
+
+public class CommandBuilder {
+    protected CommandType type; // need
+    protected String key = null;
+    protected String toDgmName = null;// for take
+    protected String fromDgmName = "local";//for remotetake/reply
+    protected Integer cgmID = null;// for local meta
+    protected CodeGear cg = null;//for localtake
+    protected DataGear dg = null;//for put/localtake/reply
+    protected Class clazz = null;// for remote
+    protected Connection connection = null;//for reply
+
+    private CommandFactory factory = new CommandFactory();
+
+    public CommandBuilder init(CommandType type){
+        this.type = type;
+        this.key = null;
+        this.toDgmName = null;
+        this.fromDgmName = "local";
+        this.cgmID = null;
+        this.cg = null;
+        this.dg = null;
+        this.clazz = null;
+        this.connection = null;
+        return this;
+    }
+
+
+    public CommandBuilder key(String key){
+        this.key = key;
+        return this;
+    }
+
+    public CommandBuilder toDgmName(String toDgmName){
+        this.toDgmName = toDgmName;
+        return this;
+    }
+
+    public CommandBuilder fromDgmName(String fromDgmName){
+        this.fromDgmName = fromDgmName;
+        return this;
+    }
+
+    public CommandBuilder cgmID(int cgmID){
+        this.cgmID = cgmID;
+        return this;
+    }
+
+    public CommandBuilder cg(CodeGear cg){
+        this.cg = cg;
+        return this;
+    }
+
+    public CommandBuilder dg(DataGear dg){
+        this.dg = dg;
+        return this;
+    }
+
+    public CommandBuilder clazz(Class clazz){
+        this.clazz = clazz;
+        return this;
+    }
+
+    public CommandBuilder connection(Connection connection){
+        this.connection = connection;
+        return this;
+    }
+
+    public Command build(){
+        if(type == null) throw new NullPointerException();
+        return factory.getCommand(type, this);
+    }
+
+    private class CommandFactory{
+
+        public Command getCommand(CommandType type, CommandBuilder cb) {
+            switch (type) {
+                case PUT:
+                    //check need param
+
+                    checkNull(cb.key, cb.dg);
+                    return new PutCommand(cb);
+                case TAKE:
+                    //check need param
+                    checkNull(cb.cgmID, cb.cg, cb.toDgmName, cb.key, cb.dg);
+                    return new TakeCommand(cb);
+                case PEEK:
+                    checkNull(cb.cgmID, cb.cg, cb.toDgmName, cb.key, cb.dg);
+                    return new PeekCommand(cb);
+                case REMOTETAKE:
+                    if (cb.fromDgmName.equals("local")) throw new NullPointerException();
+                    checkNull(cb.key, cb.connection, cb.clazz);
+                    return new RemoteTakeCommand(cb);
+                case REMOTEPEEK:
+                    if (cb.fromDgmName.equals("local")) throw new NullPointerException();
+                    checkNull(cb.key, cb.connection, cb.clazz);
+                    return new RemotePeekCommand(cb);
+                case REPLY:
+                    if (cb.fromDgmName.equals("local")) throw new NullPointerException();
+                    checkNull(cb.key, cb.connection, cb.dg);
+                    return new ReplyCommand(cb);
+                case CLOSE:
+                    checkNull(cb.connection);
+                    return new CloseCommand(cb);
+                case FINISH:
+                    return new FinishCommand(cb);
+            }
+            return null;
+        }
+
+        public void checkNull(Object... params){
+            for(Object param: params){
+                if(param == null){
+                    throw new NullPointerException();
+
+                }
+            }
+        }
+    }
+
+}
--- a/src/main/java/christie/datagear/command/FinishCommand.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/command/FinishCommand.java	Fri Mar 15 18:01:06 2019 +0900
@@ -7,12 +7,18 @@
 public class FinishCommand extends Command {
 
 
-    public FinishCommand() {
-        CommandType type = CommandType.FINISH;
+    public FinishCommand(CommandBuilder cb) {
+        super(cb);
     }
 
+
+    @Override
+    public void execute() {
+        System.exit(0);
+    }
     @Override
     public ByteBuffer convert() {
         return null;
     }
+
 }
--- a/src/main/java/christie/datagear/command/PeekCommand.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/command/PeekCommand.java	Fri Mar 15 18:01:06 2019 +0900
@@ -4,8 +4,8 @@
 import christie.datagear.dg.DataGear;
 
 public class PeekCommand extends TakeCommand{
-    public PeekCommand(CodeGear cg, int cgmID, String toDgmName, String key, DataGear dg) {
-        super(cg, cgmID, toDgmName, key, dg);
-        this.type = CommandType.PEEK;
+    public PeekCommand(CommandBuilder cb) {
+        super(cb);
+
     }
 }
--- a/src/main/java/christie/datagear/command/PutCommand.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/command/PutCommand.java	Fri Mar 15 18:01:06 2019 +0900
@@ -11,13 +11,15 @@
 
 public class PutCommand extends Command {
 
-    public PutCommand(int cgmID, String toDgmName, String key, DataGear dg){
-        this.type = CommandType.PUT;
-        this.cgmID = cgmID;
-        this.toDgmName = toDgmName;
-        this.key = key;
-        this.dg = dg;
+    public PutCommand(CommandBuilder cb){
+        super(cb);
         this.clazz = dg.getClazz();
+
+    }
+
+    @Override
+    public void execute() {
+
     }
 
     @Override
--- a/src/main/java/christie/datagear/command/RemotePeekCommand.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/command/RemotePeekCommand.java	Fri Mar 15 18:01:06 2019 +0900
@@ -4,13 +4,7 @@
 import christie.datagear.RemoteMessage;
 
 public class RemotePeekCommand extends RemoteTakeCommand {
-    public RemotePeekCommand(RemoteMessage msg, Connection cn) throws ClassNotFoundException {
-        super(msg, cn);
-        this.type = CommandType.REMOTEPEEK;
-    }
-
-    public RemotePeekCommand(String fromDgmName, Command cm, Connection cn) {
-        super(fromDgmName, cm, cn);
-        this.type = CommandType.REMOTEPEEK;
+    public RemotePeekCommand(CommandBuilder cp) {
+        super(cp);
     }
 }
--- a/src/main/java/christie/datagear/command/RemoteTakeCommand.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/command/RemoteTakeCommand.java	Fri Mar 15 18:01:06 2019 +0900
@@ -13,22 +13,14 @@
 
 public class RemoteTakeCommand extends Command {
 
-    public RemoteTakeCommand(RemoteMessage msg, Connection cn) throws ClassNotFoundException {
-        this(msg.fromDgmName, msg.key, cn, Class.forName(msg.clazz));
-    }
-
-    public RemoteTakeCommand(String fromDgmName, Command cm, Connection cn) {
-        this(fromDgmName, cm.key, cn, cm.clazz);
+    public RemoteTakeCommand(CommandBuilder cb){
+        super(cb);
+        this.dg = new MessagePackDataGear(this.clazz);
     }
 
-    private RemoteTakeCommand(String fromDgmName, String key, Connection cn, Class clazz){
-        this.type = CommandType.REMOTETAKE;
-        this.fromDgmName = fromDgmName;
-        this.key = key;
-        this.clazz = clazz;
-        this.dg = new MessagePackDataGear(this.clazz);
-        this.connection = cn;
-
+    @Override
+    public void execute() {
+        new CommandBuilder().init(CommandType.REPLY).connection(connection).build().execute();
     }
 
     @Override
--- a/src/main/java/christie/datagear/command/ReplyCommand.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/command/ReplyCommand.java	Fri Mar 15 18:01:06 2019 +0900
@@ -2,11 +2,14 @@
 
 public class ReplyCommand extends PutCommand {
 
-    public ReplyCommand(Command cm){
-        super(0, null, cm.key, cm.dg);
-        this.fromDgmName = cm.fromDgmName;
-        this.type = CommandType.REPLY;
-        this.connection = cm.connection;
+    public ReplyCommand(CommandBuilder cb){
+        super(cb);
+
+    }
+
+    @Override
+    public void execute() {
+        connection.write(this);
     }
 
     public void setData(Object data){
--- a/src/main/java/christie/datagear/command/TakeCommand.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/command/TakeCommand.java	Fri Mar 15 18:01:06 2019 +0900
@@ -1,6 +1,7 @@
 package christie.datagear.command;
 
 import christie.codegear.CodeGear;
+import christie.datagear.DataGears;
 import christie.datagear.command.Command;
 import christie.datagear.command.CommandType;
 import christie.datagear.dg.DataGear;
@@ -9,18 +10,19 @@
 
 public class TakeCommand extends Command {
 
-    public TakeCommand(CodeGear cg, int cgmID, String toDgmName, String key, DataGear dg){
-        this.type = CommandType.TAKE;
-        this.cgmID =  cgmID;
-        this.toDgmName = toDgmName;
-        this.key = key;
-        this.dg = dg;
+    public TakeCommand(CommandBuilder cb) {
+        super(cb);
         this.clazz = dg.getClazz();
-        this.cg = cg;
     }
 
     @Override
     public ByteBuffer convert() {
         return null;
     }
+
+    @Override
+    public void execute() {
+        cg.getIdg().setInputs(key, dg);
+
+    }
 }
--- a/src/main/java/christie/datagear/dg/DataGear.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/datagear/dg/DataGear.java	Fri Mar 15 18:01:06 2019 +0900
@@ -62,4 +62,8 @@
         return data;
     }
 
+    @Override
+    public String toString() {
+        return "DataGear : classname " + clazz;
+    }
 }
--- a/src/main/java/christie/test/PriorityTest/StartPriorityTest.java	Fri Mar 15 17:55:35 2019 +0900
+++ b/src/main/java/christie/test/PriorityTest/StartPriorityTest.java	Fri Mar 15 18:01:06 2019 +0900
@@ -18,7 +18,7 @@
         for(int i = 0; i < max; i ++){
             cgm.setup(new PriorityTestCodeGear("A" + String.valueOf(i), 200),0);     //Defaults to priority=0
         }
-
+        //Priority=1
         for(int i = 0; i < max; i ++){
             cgm.setup(new PriorityTestCodeGear("B" + String.valueOf(i), 200),1);     //Defaults to priority=0
         }