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());
     }
+
 }