# HG changeset patch # User akahori # Date 1552365306 -32400 # Node ID e486c13d9ea9ddae833801bacbdf4aa4f18ea766 # Parent 3808f0d975a6406ee4783dd96efb465a89ccc8c7 add CommandBuilder diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/codegear/CodeGear.java --- 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() { diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/codegear/CodeGearManager.java --- 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 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(){ diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/codegear/InputDataGear.java --- 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 inputValue = new ConcurrentHashMap();//受け皿 public CodeGearManager cgm; public CodeGear cg; diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/daemon/IncomingTcpConnection.java --- 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にセット diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/datagear/DataGearManager.java --- 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); diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/datagear/LocalDataGearManager.java --- 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); diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/datagear/RemoteDataGearManager.java --- 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); } diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/datagear/command/CloseCommand.java --- 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; diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/datagear/command/Command.java --- 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); //} diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/datagear/command/CommandBuilder.java --- /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; + } + } + +} diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/datagear/command/FinishCommand.java --- 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); } diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/datagear/command/PeekCommand.java --- 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); + } } diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/datagear/command/PutCommand.java --- 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(); } diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/datagear/command/RemotePeekCommand.java --- 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); } } diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/datagear/command/RemoteTakeCommand.java --- 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 diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/datagear/command/ReplyCommand.java --- 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 diff -r 3808f0d975a6 -r e486c13d9ea9 src/main/java/christie/datagear/command/TakeCommand.java --- 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