45
|
1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle;
|
|
2
|
|
3 import java.util.Iterator;
|
|
4
|
|
5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes;
|
|
6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesContainer;
|
|
7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children;
|
|
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
|
|
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Parent;
|
|
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
|
|
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
|
|
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
|
|
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference;
|
|
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
|
|
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet;
|
|
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor;
|
|
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTransactionManager;
|
|
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
|
|
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
|
|
20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
|
|
21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
|
|
22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter;
|
|
23 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter.Converter;
|
|
24
|
|
25 public class DefaultJungleTree implements JungleTree
|
|
26 {
|
|
27 private final AtomicReservableReference<DefaultChangeSet> repository;
|
|
28 private final String uuid;
|
|
29 private final ChangeListWriter writer;
|
|
30
|
|
31 public DefaultJungleTree(DefaultChangeSet _set,String _uuid,ChangeListWriter _writer)
|
|
32 {
|
|
33 repository = new AtomicReservableReference<DefaultChangeSet>(_set);
|
|
34 uuid = _uuid;
|
|
35 writer = _writer;
|
|
36 }
|
|
37
|
|
38 @Override
|
|
39 public DefaultJungleTreeEditor getTreeEditor()
|
|
40 {
|
|
41 DefaultChangeSet tip = repository.get();
|
|
42 DefaultTransactionManager txManager = new DefaultTransactionManager(writer,tip,repository,uuid);
|
|
43 DefaultNode root = tip.getRoot();
|
|
44 return new DefaultJungleTreeEditor(root,txManager,new DefaultTraverser());
|
|
45 }
|
|
46
|
|
47 @Override
|
|
48 public Node getRootNode()
|
|
49 {
|
|
50 ChangeSet set = repository.get();
|
|
51 return set.getRoot();
|
|
52 }
|
|
53
|
|
54 public static class NodeWrapper<T extends Parent<T> & AttributesContainer> implements Node
|
|
55 {
|
|
56 private final T wrap;
|
|
57
|
|
58 public NodeWrapper(T _wrap)
|
|
59 {
|
|
60 wrap = _wrap;
|
|
61 }
|
|
62
|
|
63 @Override
|
|
64 public Attributes getAttributes()
|
|
65 {
|
|
66 return wrap.getAttributes();
|
|
67 }
|
|
68
|
|
69 @Override
|
|
70 public Children<Node> getChildren()
|
|
71 {
|
|
72 Children<T> children = wrap.getChildren();
|
|
73 return new ChildrenWrapper<T>(children);
|
|
74 }
|
|
75
|
|
76 public static class ChildrenWrapper<T extends Parent<T> & AttributesContainer> implements Children<Node>
|
|
77 {
|
|
78 private Children<T> wrap;
|
|
79
|
|
80 public ChildrenWrapper(Children<T> _wrap)
|
|
81 {
|
|
82 wrap = _wrap;
|
|
83 }
|
|
84
|
|
85 @Override
|
|
86 public Iterator<Node> iterator()
|
|
87 {
|
|
88 Converter<Node,T> converter = new IterableConverter.Converter<Node,T>(){
|
|
89 @Override
|
|
90 public Node conv(T _b){
|
|
91 return new NodeWrapper<T>(_b);
|
|
92 }
|
|
93 };
|
|
94
|
|
95 IterableConverter<Node,T> iterable = new IterableConverter<Node,T>(wrap,converter);
|
|
96 return iterable.iterator();
|
|
97 }
|
|
98
|
|
99 @Override
|
|
100 public Either<Error,Node> at(int _pos)
|
|
101 {
|
|
102 Either<Error,T> either = wrap.at(_pos);
|
|
103 if(either.isA()){
|
|
104 return DefaultEither.newA(either.a());
|
|
105 }
|
|
106 T node = either.b();
|
|
107 Node wrapper = new NodeWrapper<T>(node);
|
|
108 return DefaultEither.newB(wrapper);
|
|
109 }
|
|
110
|
|
111 @Override
|
|
112 public int size()
|
|
113 {
|
|
114 return wrap.size();
|
|
115 }
|
|
116 }
|
|
117 }
|
|
118 }
|