changeset 213:e486c13d9ea9

add CommandBuilder
author akahori
date Tue, 12 Mar 2019 13:35:06 +0900
parents 3808f0d975a6
children 7d08e76d2553
files src/main/java/christie/codegear/CodeGear.java src/main/java/christie/codegear/CodeGearManager.java src/main/java/christie/codegear/InputDataGear.java src/main/java/christie/daemon/IncomingTcpConnection.java src/main/java/christie/datagear/DataGearManager.java src/main/java/christie/datagear/LocalDataGearManager.java src/main/java/christie/datagear/RemoteDataGearManager.java src/main/java/christie/datagear/command/CloseCommand.java src/main/java/christie/datagear/command/Command.java src/main/java/christie/datagear/command/CommandBuilder.java src/main/java/christie/datagear/command/FinishCommand.java src/main/java/christie/datagear/command/PeekCommand.java src/main/java/christie/datagear/command/PutCommand.java src/main/java/christie/datagear/command/RemotePeekCommand.java src/main/java/christie/datagear/command/RemoteTakeCommand.java src/main/java/christie/datagear/command/ReplyCommand.java src/main/java/christie/datagear/command/TakeCommand.java
diffstat 17 files changed, 247 insertions(+), 98 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/christie/codegear/CodeGear.java	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/codegear/CodeGear.java	Tue Mar 12 13:35: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;
@@ -23,6 +21,8 @@
     private CodeGearManager cgm;
     private DataGearManager localDGM;
     private CodeGearExecutor cge;
+    private static final CommandBuilder cb = new CommandBuilder();
+
 
     protected abstract void run(CodeGearManager cgm);
 
@@ -38,28 +38,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 = cb.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	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/codegear/CodeGearManager.java	Tue Mar 12 13:35: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(){
--- a/src/main/java/christie/codegear/InputDataGear.java	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/codegear/InputDataGear.java	Tue Mar 12 13:35: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/daemon/IncomingTcpConnection.java	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/daemon/IncomingTcpConnection.java	Tue Mar 12 13:35: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;
@@ -22,6 +20,8 @@
     CodeGearManager cgm;
     Connection connection;
     private MessagePack packer = new MessagePack();
+    private static final CommandBuilder cb = new CommandBuilder();
+
 
     public IncomingTcpConnection(Connection connection) {
         this.connection = connection;
@@ -63,14 +63,12 @@
                         break;
 
                     case REMOTEPEEK:
-                        try {
-                            cgm.getLocalDGM().runCommand(new RemotePeekCommand(msg, connection));
-                        } catch (ClassNotFoundException e) {
-                            e.printStackTrace();
-                        }
-                        break;
                     case REMOTETAKE:
-                        cgm.getLocalDGM().runCommand(new RemoteTakeCommand(msg, connection));
+                        Command cm = cb.init(type).fromDgmName(msg.fromDgmName)
+                                .key(msg.key)
+                                .clazz(Class.forName(msg.clazz))
+                                .connection(connection).build();
+                        cgm.getLocalDGM().runCommand(cm);
 
                         break;
                     case REPLY://待っていたwaitListに渡してcsにセット
--- a/src/main/java/christie/datagear/DataGearManager.java	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/datagear/DataGearManager.java	Tue Mar 12 13:35:06 2019 +0900
@@ -2,6 +2,7 @@
 
 import christie.codegear.CodeGear;
 import christie.datagear.command.Command;
+import christie.datagear.command.CommandBuilder;
 import christie.datagear.dg.DataGear;
 
 /**
@@ -11,6 +12,7 @@
 public abstract class DataGearManager {
     protected DataGears dataGears = new DataGears();
     public WaitList waitList = new WaitList();
+    protected CommandBuilder cb = new CommandBuilder();
     public abstract void put(String key, Object data);
     public abstract void runCommand(Command cm);
     public abstract void resolveWaitCommand(String key, DataGear dg);
--- a/src/main/java/christie/datagear/LocalDataGearManager.java	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/datagear/LocalDataGearManager.java	Tue Mar 12 13:35: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,8 +15,8 @@
         put(key, dg);
     }
 
-    public void put(String key, DataGear dg){
-        runCommand(new PutCommand(1, "local", key, dg));
+    public void put(String key, DataGear dg) {
+        runCommand(cb.init(CommandType.PUT).cgmID(1).toDgmName("local").key(key).dg(dg).build());
     }
 
     public void runCommand(Command cm){
@@ -32,7 +34,7 @@
             case PEEK:
             case REMOTEPEEK:
                 if (dataGears.containsKey(cm.key)) {
-                    cm.setDg(dataGears.getData(cm));
+                    setData(cm);
                     cm.execute();
                 } else {
                     waitList.add(cm);
@@ -45,11 +47,16 @@
         }
     }
 
+    private void setData(Command cm){
+        cm.setDg(dataGears.getData(cm));
+    }
     @Override
     public void resolveWaitCommand(String key, DataGear dg) {
 
     }
 
+
+
     @Override
     public void finish() {
         System.exit(0);
--- a/src/main/java/christie/datagear/RemoteDataGearManager.java	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/datagear/RemoteDataGearManager.java	Tue Mar 12 13:35: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 = cb.init(CommandType.PUT).key(key)
+                                             .dg(new DataGear(data))
+                                             .build();
         // これ入れないと, connectionがnullの時があるのでしょうがなくwait.
         // コンストラクタで呼び出されるThreadをやめて実効すればいんだけどね...
         if(!connect) connectWait();
@@ -73,15 +74,21 @@
     @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 = cb.init(type).fromDgmName(connection.name)
+                                         .key(cm.key)
+                                         .clazz(cm.clazz)
+                                            .connection(connection)
+                                            .build();
+
         connection.write(remoteCmd);
     }
 
@@ -95,13 +102,13 @@
 
     @Override
     public void finish() {
-        Command cmd = new FinishCommand();
+        Command cmd = cb.init(CommandType.FINISH).build();
         connection.sendCommand(cmd);
     }
 
     @Override
     public void close() {
-        Command cmd = new CloseCommand();
+        Command cmd = cb.init(CommandType.CLOSE).connection(connection).build();
         connection.sendCommand(cmd);
     }
 
--- a/src/main/java/christie/datagear/command/CloseCommand.java	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/datagear/command/CloseCommand.java	Tue Mar 12 13:35:06 2019 +0900
@@ -1,16 +1,16 @@
 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;
--- a/src/main/java/christie/datagear/command/Command.java	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/datagear/command/Command.java	Tue Mar 12 13:35:06 2019 +0900
@@ -2,25 +2,40 @@
 
 import christie.codegear.CodeGear;
 import christie.daemon.Connection;
-import christie.datagear.DataGearManager;
-import christie.datagear.DataGears;
 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 int 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);
 
@@ -37,6 +52,8 @@
         this.dg.setData(obj);
     }
 
+
+
     //public void removeInputs(){
         //cg.getIdg().removeInputs(key);
     //}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/christie/datagear/command/CommandBuilder.java	Tue Mar 12 13:35:06 2019 +0900
@@ -0,0 +1,149 @@
+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;
+    protected String toDgmName;// for take
+    protected String fromDgmName;//for remotetake/reply
+    protected int cgmID = -1;// 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 Object _lock = new Object();
+    private Boolean sync = false;
+
+    public synchronized CommandBuilder init(CommandType type){
+        //lock();
+        this.type = type;
+        this.key = null;
+        this.toDgmName = null;
+        this.fromDgmName = "local";
+        this.cgmID = -1;
+        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 CommandFactory.getCommand(type, this);
+    }
+
+    public void lock(){
+        synchronized (_lock){
+            while(sync){
+                try {
+                    _lock.wait();
+                } catch (InterruptedException e) {
+                }
+            }
+        }
+        sync = true;
+    }
+
+    public void unLock(){
+        synchronized (_lock){
+            _lock.notify();
+            sync = false;
+        }
+    }
+
+    private static class CommandFactory{
+
+        public static Command getCommand(CommandType type, CommandBuilder cb) {
+            switch (type) {
+                case PUT:
+                    //check need param
+                    if (cb.key == null || cb.dg == null) {
+                        throw new NullPointerException();
+                    }
+                    return new PutCommand(cb);
+                case TAKE:
+                    //check need param
+                    if (cb.cg == null || cb.cgmID == -1 || cb.toDgmName == null || cb.key == null || cb.dg == null) {
+                        throw new NullPointerException();
+                    }
+                    return new TakeCommand(cb);
+                case PEEK:
+                    if (cb.cg == null || cb.cgmID == -1 || cb.toDgmName == null || cb.key == null || cb.dg == null) {
+                        throw new NullPointerException();
+                    }
+                    return new PeekCommand(cb);
+                case REMOTETAKE:
+                    if (cb.fromDgmName.equals("local") || cb.key == null || cb.connection == null || cb.clazz == null) {
+                        throw new NullPointerException();
+                    }
+                    return new RemoteTakeCommand(cb);
+                case REMOTEPEEK:
+                    if (cb.fromDgmName.equals("local") || cb.key == null || cb.connection == null || cb.clazz == null) {
+                        throw new NullPointerException();
+                    }
+                    return new RemotePeekCommand(cb);
+                case REPLY:
+                    if (cb.fromDgmName.equals("local") || cb.key == null || cb.dg == null || cb.connection == null) {
+                        throw new NullPointerException();
+                    }
+                    return new ReplyCommand(cb);
+                case CLOSE:
+                    if (cb.connection == null) {
+                        throw new NullPointerException();
+                    }
+                    return new CloseCommand(cb);
+                case FINISH:
+                    return new FinishCommand(cb);
+            }
+            //cb.unLock();
+            return null;
+        }
+    }
+
+}
--- a/src/main/java/christie/datagear/command/FinishCommand.java	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/datagear/command/FinishCommand.java	Tue Mar 12 13:35:06 2019 +0900
@@ -7,8 +7,8 @@
 public class FinishCommand extends Command {
 
 
-    public FinishCommand() {
-        CommandType type = CommandType.FINISH;
+    public FinishCommand(CommandBuilder cb) {
+        super(cb);
     }
 
 
--- a/src/main/java/christie/datagear/command/PeekCommand.java	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/datagear/command/PeekCommand.java	Tue Mar 12 13:35: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	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/datagear/command/PutCommand.java	Tue Mar 12 13:35:06 2019 +0900
@@ -11,12 +11,8 @@
 
 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();
     }
 
--- a/src/main/java/christie/datagear/command/RemotePeekCommand.java	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/datagear/command/RemotePeekCommand.java	Tue Mar 12 13:35: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	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/datagear/command/RemoteTakeCommand.java	Tue Mar 12 13:35:06 2019 +0900
@@ -13,27 +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);
-    }
-
-    private RemoteTakeCommand(String fromDgmName, String key, Connection cn, Class clazz){
-        this.type = CommandType.REMOTETAKE;
-        this.fromDgmName = fromDgmName;
-        this.key = key;
-        this.clazz = clazz;
+    public RemoteTakeCommand(CommandBuilder cb){
+        super(cb);
         this.dg = new MessagePackDataGear(this.clazz);
-        this.connection = cn;
-
     }
 
     @Override
     public void execute() {
-        new ReplyCommand(this).execute();
+        new CommandBuilder().init(CommandType.REPLY).connection(connection).build().execute();
     }
 
     @Override
--- a/src/main/java/christie/datagear/command/ReplyCommand.java	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/datagear/command/ReplyCommand.java	Tue Mar 12 13:35:06 2019 +0900
@@ -2,11 +2,9 @@
 
 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
--- a/src/main/java/christie/datagear/command/TakeCommand.java	Mon Mar 11 16:56:11 2019 +0900
+++ b/src/main/java/christie/datagear/command/TakeCommand.java	Tue Mar 12 13:35:06 2019 +0900
@@ -10,14 +10,9 @@
 
 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