Mercurial > hg > Database > Alice
annotate src/main/java/alice/codesegment/CodeSegment.java @ 636:33f300d0720a
running CodeSegment by Annotation without create Receiver :D
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 03 Dec 2017 22:09:35 +0900 |
parents | 0423eb7fd9ee |
children | 3e00000949aa |
rev | line source |
---|---|
345 | 1 package alice.codesegment; |
2 | |
630 | 3 import java.io.IOException; |
4 import java.lang.reflect.*; | |
345 | 5 import java.util.ArrayList; |
636
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
6 import java.util.HashMap; |
345 | 7 |
636
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
8 import alice.Annotation.MetaReceiver; |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
9 import alice.Annotation.Peek; |
630 | 10 import alice.Annotation.Take; |
345 | 11 import alice.codesegment.InputDataSegment; |
630 | 12 import alice.datasegment.CommandType; |
345 | 13 import alice.datasegment.Receiver; |
630 | 14 import javassist.*; |
636
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
15 import javassist.compiler.ast.Pair; |
630 | 16 import javassist.tools.reflect.Sample; |
17 import sun.jvm.hotspot.oops.Instance; | |
345 | 18 |
19 public abstract class CodeSegment implements Runnable { | |
419 | 20 |
21 public InputDataSegment ids = new InputDataSegment(this); | |
22 public OutputDataSegment ods = new OutputDataSegment(); | |
636
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
23 private ArrayList<Receiver> list = new ArrayList<Receiver>();//Receivers of after setKey |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
490
diff
changeset
|
24 private int priority = Thread.NORM_PRIORITY;//? |
636
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
25 private ArrayList<MetaReceiver> receivers = new ArrayList<MetaReceiver>();//all Receivers |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
26 private Field[] fields; |
419 | 27 |
634
69f9c5ff1df9
work reflection setKey, but not correct
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
633
diff
changeset
|
28 public CodeSegment(){ |
635
0423eb7fd9ee
work create Receiver from Annotation.
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
29 createReceiver(); |
0423eb7fd9ee
work create Receiver from Annotation.
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
30 setKey(); |
0423eb7fd9ee
work create Receiver from Annotation.
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
31 } |
0423eb7fd9ee
work create Receiver from Annotation.
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
32 |
0423eb7fd9ee
work create Receiver from Annotation.
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
33 public void createReceiver(){ |
636
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
34 this.fields = this.getClass().getDeclaredFields(); |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
35 for (Field field : fields) { |
630 | 36 if (field.isAnnotationPresent(Take.class)){ |
636
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
37 receivers.add(new MetaReceiver(field.getType(), ids.create(CommandType.TAKE))); |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
38 } |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
39 else if (field.isAnnotationPresent(Peek.class)){ |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
40 receivers.add(new MetaReceiver(field.getType(), ids.create(CommandType.PEEK))); |
635
0423eb7fd9ee
work create Receiver from Annotation.
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
41 } |
0423eb7fd9ee
work create Receiver from Annotation.
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
42 } |
0423eb7fd9ee
work create Receiver from Annotation.
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
43 } |
0423eb7fd9ee
work create Receiver from Annotation.
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
44 |
0423eb7fd9ee
work create Receiver from Annotation.
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
45 public void setKey(){ |
0423eb7fd9ee
work create Receiver from Annotation.
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
46 int i = 0; |
636
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
47 for (Field field : fields) { |
635
0423eb7fd9ee
work create Receiver from Annotation.
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
48 if (field.isAnnotationPresent(Take.class)){ |
630 | 49 Take ano = field.getAnnotation(Take.class); |
636
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
50 receivers.get(i).getReceiver().setKey(ano.value()); |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
51 i++; |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
52 } |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
53 else if (field.isAnnotationPresent(Peek.class)){ |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
54 Peek ano = field.getAnnotation(Peek.class); |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
55 receivers.get(i).getReceiver().setKey(ano.value()); |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
56 i++; |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
57 } |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
58 } |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
59 } |
634
69f9c5ff1df9
work reflection setKey, but not correct
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
633
diff
changeset
|
60 |
636
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
61 public void setValue(){ |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
62 int i = 0; |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
63 for (Field field : fields){ |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
64 if (field.isAnnotationPresent(Take.class) || field.isAnnotationPresent(Peek.class)) { |
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
65 field.setAccessible(true); |
633
746447b7c3e0
add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
630
diff
changeset
|
66 try { |
636
33f300d0720a
running CodeSegment by Annotation without create Receiver :D
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
67 field.set(this, receivers.get(i).asClass()); |
635
0423eb7fd9ee
work create Receiver from Annotation.
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
68 i++; |
633
746447b7c3e0
add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
630
diff
changeset
|
69 } catch (IllegalAccessException e) { |
746447b7c3e0
add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
630
diff
changeset
|
70 e.printStackTrace(); |
746447b7c3e0
add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
630
diff
changeset
|
71 } |
630 | 72 } |
73 } | |
634
69f9c5ff1df9
work reflection setKey, but not correct
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
633
diff
changeset
|
74 } |
630 | 75 |
419 | 76 public void execute() { |
77 ids.receive(); | |
78 } | |
79 | |
481 | 80 public void register(Receiver receiver) { |
81 list.add(receiver); | |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
490
diff
changeset
|
82 }//Receiverを作成? |
481 | 83 |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
490
diff
changeset
|
84 public void recycle(){//idsのリセット |
419 | 85 ids.init(); |
86 ids.setCounter(list.size()); | |
87 for (Receiver receiver : list) { | |
88 receiver.index = 0; | |
89 ids.recommand(receiver); | |
90 } | |
91 } | |
345 | 92 |
490 | 93 public int getPriority() { |
94 return priority; | |
95 } | |
96 | |
97 public void setPriority(int priority) { | |
98 this.priority = priority; | |
99 } | |
630 | 100 |
101 } |