Mercurial > hg > Database > Christie
changeset 6:3dcfe63d6394
set type to DataGear by Annotation
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 27 Dec 2017 00:06:50 +0900 |
parents | 5be6647b87d2 |
children | 21372a589bd3 |
files | src/main/java/christie/annotation/Peek.java src/main/java/christie/codegear/CodeGear.java src/main/java/christie/codegear/CodeGearExecutor.java src/main/java/christie/codegear/CodeGearManager.java src/main/java/christie/codegear/CommandType.java src/main/java/christie/codegear/InputDataGear.java src/main/java/christie/codegear/StartCodeGear.java src/main/java/christie/datagear/DataGear.java src/main/java/christie/datagear/LocalDataGearManager.java src/main/java/christie/test/StartTest.java src/main/java/christie/test/TestCodeGear.java |
diffstat | 11 files changed, 145 insertions(+), 65 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/christie/annotation/Peek.java Wed Dec 27 00:06:50 2017 +0900 @@ -0,0 +1,15 @@ +package christie.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by e125769 on 12/7/17. + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Peek { + String value(); +} \ No newline at end of file
--- a/src/main/java/christie/codegear/CodeGear.java Thu Dec 14 20:46:18 2017 +0900 +++ b/src/main/java/christie/codegear/CodeGear.java Wed Dec 27 00:06:50 2017 +0900 @@ -1,5 +1,6 @@ package christie.codegear; +import christie.annotation.Peek; import christie.annotation.Take; import christie.datagear.DataGear; import christie.datagear.DataGearManager; @@ -12,42 +13,41 @@ * Created by e125769 on 12/7/17. * Annotationからのinputコマンドの生成、揃ったDataGearの値を返す */ -public abstract class CodeGear implements Runnable { +public abstract class CodeGear implements Runnable{ public InputDataGear idg = new InputDataGear(this); public OutputDataGear odg = new OutputDataGear(this); public ArrayList<Command> commandList = new ArrayList<Command>(); public CodeGearManager cgm; public DataGearManager dgm; + //public CodeGearExecutor cge; - public CodeGear(CodeGearManager cgm){//AnnotationからInputDataGearをセット + public CodeGear(CodeGearManager cgm){ this.cgm = cgm; - this.dgm = cgm.getDGM("local"); + //this.cge = new CodeGearExecutor(); + this.dgm = cgm.getDGM(); + } + + public void execute() {//AnnotationからInputDataGearをセット odg.initODG(cgm); for (Field field : this.getClass().getDeclaredFields()) { - if (field.isAnnotationPresent(Take.class)){ + DataGear dg = null; + try { + dg = (DataGear) field.get(this); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + if (field.isAnnotationPresent(Take.class)) { Take ano = field.getAnnotation(Take.class); - commandList.add(new Command(this, null, "local", ano.value(), CommandType.TAKE)); + commandList.add(new Command(this, dg, "local", ano.value(), CommandType.TAKE)); + } else if (field.isAnnotationPresent(Peek.class)) { + Peek ano = field.getAnnotation(Peek.class); + commandList.add(new Command(this, dg, "local", ano.value(), CommandType.PEEK)); } } - idg.finishInput(this.cgm, commandList); + idg.finishInput(cgm, commandList); } - public void setInputValue(){//Annotationから揃ったInputDataGearの値をキャスト - for (Field field : this.getClass().getDeclaredFields()) { - field.setAccessible(true); - if (field.isAnnotationPresent(Take.class)){ - Take ano = field.getAnnotation(Take.class); - try { - field.set(this, idg.inputValue.get(ano.value()));//ダウンキャストできるか? - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - } - - public void run(){} - }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/christie/codegear/CodeGearExecutor.java Wed Dec 27 00:06:50 2017 +0900 @@ -0,0 +1,16 @@ +package christie.codegear; + +public class CodeGearExecutor implements Runnable { + CodeGear cg; + CodeGearManager cgm; + + public CodeGearExecutor(CodeGear cg, CodeGearManager cgm){ + this.cg = cg; + this.cgm = cgm; + } + + @Override + public void run() { + //cg.run(cgm); + } +}
--- a/src/main/java/christie/codegear/CodeGearManager.java Thu Dec 14 20:46:18 2017 +0900 +++ b/src/main/java/christie/codegear/CodeGearManager.java Wed Dec 27 00:06:50 2017 +0900 @@ -4,19 +4,15 @@ import christie.datagear.LocalDataGearManager; import christie.datagear.RemoteDataGearManager; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; /** * Created by e125769 on 12/7/17. * CodeGearの実行 */ public class CodeGearManager{ - private HashMap<String, DataGearManager> dataGearManagers = new HashMap<String, DataGearManager>(); + private ConcurrentHashMap<String, DataGearManager> dataGearManagers = new ConcurrentHashMap<String, DataGearManager>(); private ThreadPoolExecutor codeGearExecutor; public CodeGearManager(ThreadPoolExecutor exe) { @@ -24,20 +20,8 @@ codeGearExecutor = exe; } - public void submit(CodeGear cg){ - codeGearExecutor.setThreadFactory(makeThreadFactory(Thread.MAX_PRIORITY)); - codeGearExecutor.execute(cg); - } - - private ThreadFactory makeThreadFactory(final int priority) { - return new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - Thread thread = new Thread(r); - thread.setPriority(priority); - return thread; - } - }; + public DataGearManager getDGM(){ + return dataGearManagers.get("local"); } public DataGearManager getDGM(String dest){ @@ -47,4 +31,9 @@ public void createRemoteDataGeareManager(String dist){ dataGearManagers.put(dist, new RemoteDataGearManager()); } + + public void submit(CodeGear cg){ + codeGearExecutor.execute(cg); + } + }
--- a/src/main/java/christie/codegear/CommandType.java Thu Dec 14 20:46:18 2017 +0900 +++ b/src/main/java/christie/codegear/CommandType.java Wed Dec 27 00:06:50 2017 +0900 @@ -4,5 +4,6 @@ public enum CommandType { PUT, - TAKE; + TAKE, + PEEK; }
--- a/src/main/java/christie/codegear/InputDataGear.java Thu Dec 14 20:46:18 2017 +0900 +++ b/src/main/java/christie/codegear/InputDataGear.java Wed Dec 27 00:06:50 2017 +0900 @@ -1,7 +1,10 @@ package christie.codegear; +import christie.annotation.Peek; +import christie.annotation.Take; import christie.datagear.DataGear; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; @@ -39,11 +42,40 @@ public void count(){//Commandが実行されるたびにデクリメント if (--count == 0){ - cg.setInputValue(); + setInputValue(); submitCG(); } } + public void setInputValue(){//Annotationから揃ったInputDataGearの値をキャスト + for (Field field : cg.getClass().getDeclaredFields()) { + field.setAccessible(true); + if (field.isAnnotationPresent(Take.class)){ + Take ano = field.getAnnotation(Take.class); + try { + field.set(cg, nullCheck(ano.value())); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } else if (field.isAnnotationPresent(Peek.class)){ + Peek ano = field.getAnnotation(Peek.class); + try { + field.set(cg, nullCheck(ano.value())); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + } + + public Object nullCheck(String key){ + if (inputValue.get(key).getData() != null){ + return inputValue.get(key); + } else { + throw new IllegalArgumentException("'" + key + "' is null! this DataGear required type of " + inputValue.get(key).getClazz()); + } + } + void submitCG(){ cgm.submit(cg); }
--- a/src/main/java/christie/codegear/StartCodeGear.java Thu Dec 14 20:46:18 2017 +0900 +++ b/src/main/java/christie/codegear/StartCodeGear.java Wed Dec 27 00:06:50 2017 +0900 @@ -1,20 +1,22 @@ package christie.codegear; import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public abstract class StartCodeGear implements Runnable { - static HashMap<String, CodeGearManager> cgms = new HashMap<String, CodeGearManager>(); - static LinkedBlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<Runnable>(); - static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), // initial number of threads + ConcurrentHashMap<String, CodeGearManager> cgms = new ConcurrentHashMap<>(); + LinkedBlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<Runnable>(); + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), // initial number of threads Runtime.getRuntime().availableProcessors(), Integer.MAX_VALUE, // keepAliveTime TimeUnit.SECONDS, taskQueue); - public static CodeGearManager createCGM(String name){ + + public CodeGearManager createCGM(String name){ CodeGearManager cgm = new CodeGearManager(threadPoolExecutor); cgms.put(name, cgm); return cgm;
--- a/src/main/java/christie/datagear/DataGear.java Thu Dec 14 20:46:18 2017 +0900 +++ b/src/main/java/christie/datagear/DataGear.java Wed Dec 27 00:06:50 2017 +0900 @@ -1,17 +1,24 @@ package christie.datagear; public class DataGear<T>{ - T data; - byte[] byteData; - Class<T> clazz; + private T data; + private Class<T> clazz; - public DataGear(T data){ - this.data = data; - setClazz(data.getClass()); + public DataGear(T data, Class clazz) { + setClazz(clazz); + setData(data); + } + + public DataGear(T... dg) { + @SuppressWarnings("unchecked") + Class<T> type = (Class<T>) dg.getClass().getComponentType(); + this.clazz = type; } public void setData(T data) { - this.data = data; + if (data.getClass() == this.clazz){ + this.data = data; + } } public void setClazz(Class clazz){
--- a/src/main/java/christie/datagear/LocalDataGearManager.java Thu Dec 14 20:46:18 2017 +0900 +++ b/src/main/java/christie/datagear/LocalDataGearManager.java Wed Dec 27 00:06:50 2017 +0900 @@ -1,6 +1,5 @@ package christie.datagear; -import christie.codegear.CodeGear; import christie.codegear.Command; /** @@ -8,7 +7,6 @@ */ public class LocalDataGearManager implements DataGearManager { - public void take(Command cm) { if (dataGears.containsKey(cm.key)) { runCommand(cm); @@ -18,10 +16,10 @@ } public void put(String key, Object data) { - DataGear dg = new DataGear(data); + DataGear dg = new DataGear(data, data.getClass()); dataGears.put(key, dg); if (waitList.containsKey(key)){ - waitList.get(key).dg = dg; + waitList.get(key).dg.setData(data); runCommand(waitList.get(key)); } } @@ -32,7 +30,10 @@ case TAKE: cm.cs.idg.setInputs(cm.key, cm.dg); dataGears.remove(cm.key); - break; + break; + case PEEK: + cm.cs.idg.setInputs(cm.key, cm.dg); + break; } waitList.remove(cm.key); }
--- a/src/main/java/christie/test/StartTest.java Thu Dec 14 20:46:18 2017 +0900 +++ b/src/main/java/christie/test/StartTest.java Wed Dec 27 00:06:50 2017 +0900 @@ -2,6 +2,8 @@ import christie.codegear.StartCodeGear; +import java.util.HashMap; + public class StartTest extends StartCodeGear{ public static void main(String args[]){ @@ -11,7 +13,14 @@ @Override public void run() { TestCodeGear test = new TestCodeGear(createCGM("first")); + test.execute(); test.dgm.put("hoge", "hogehogehoge"); - test.dgm.put("huga", 100); + + int array[][] = {{1},{2},{3},{4}}; + test.dgm.put("huga", array); + + HashMap<String, Integer> piyo= new HashMap<>(); + piyo.put("piyoyo", 100); + test.dgm.put("piyo", piyo); } }
--- a/src/main/java/christie/test/TestCodeGear.java Thu Dec 14 20:46:18 2017 +0900 +++ b/src/main/java/christie/test/TestCodeGear.java Wed Dec 27 00:06:50 2017 +0900 @@ -1,10 +1,13 @@ package christie.test; +import christie.annotation.Peek; import christie.annotation.Take; import christie.codegear.CodeGear; import christie.codegear.CodeGearManager; import christie.datagear.DataGear; +import java.util.HashMap; + /** * Created by e125769 on 12/7/17. @@ -12,19 +15,24 @@ public class TestCodeGear extends CodeGear { @Take("hoge") - DataGear hoge; + public DataGear hoge = new DataGear<String>(); @Take("huga") - DataGear huga; + public DataGear huga = new DataGear<int[][]>(); - public TestCodeGear(CodeGearManager cgm){ + @Peek("piyo") + public DataGear piyo = new DataGear<HashMap<String, Integer>>(); + + public TestCodeGear(CodeGearManager cgm) { super(cgm); } @Override - public void run() { + public void run(){ System.out.println("in run!"); System.out.println(hoge.getData()); System.out.println(huga.getData()); + System.out.println(piyo.getData()); } + }