source: java/main/src/main/java/com/framsticks/structure/LocalTree.java @ 193

Last change on this file since 193 was 193, checked in by Maciej Komosinski, 10 years ago

Set svn:eol-style native for all textual files

  • Property svn:eol-style set to native
File size: 5.5 KB
Line 
1package com.framsticks.structure;
2
3import org.apache.logging.log4j.Logger;
4import org.apache.logging.log4j.LogManager;
5
6import com.framsticks.params.Access;
7import com.framsticks.params.CompositeParam;
8import com.framsticks.params.EventListener;
9import com.framsticks.params.FramsClass;
10import com.framsticks.params.ParamBuilder;
11import com.framsticks.params.PrimitiveParam;
12import com.framsticks.params.annotations.AutoAppendAnnotation;
13import com.framsticks.params.annotations.FramsClassAnnotation;
14import com.framsticks.params.types.EventParam;
15import com.framsticks.params.types.ProcedureParam;
16import com.framsticks.util.FramsticksException;
17import com.framsticks.util.dispatching.Dispatcher;
18import com.framsticks.util.dispatching.DispatcherSetable;
19import com.framsticks.util.dispatching.Dispatching;
20import com.framsticks.util.dispatching.FutureHandler;
21import com.framsticks.util.dispatching.Joinable;
22import com.framsticks.util.dispatching.JoinableState;
23import com.framsticks.util.lang.Casting;
24
25import static com.framsticks.structure.TreeOperations.*;
26
27@FramsClassAnnotation
28public final class LocalTree extends AbstractTree {
29        private static final Logger log = LogManager.getLogger(LocalTree.class);
30
31        protected Joinable joinableRootObject;
32
33        /**
34         *
35         */
36        public LocalTree() {
37                super();
38                bufferedDispatcher.setBuffer(false);
39        }
40
41        @SuppressWarnings({ "rawtypes", "unchecked" })
42        @AutoAppendAnnotation
43        public void setRootObject(Object object) {
44                final Class<?> javaClass = object.getClass();
45                registry.registerAndBuild(javaClass);
46
47                Access access = registry.createAccess(javaClass);
48
49                assignRootParam(access.buildParam(new ParamBuilder()).id(getName()).finish(CompositeParam.class));
50                assignRootObject(object);
51
52                if (object instanceof Joinable) {
53                        joinableRootObject = (Joinable) object;
54                }
55                if (object instanceof DispatcherSetable) {
56                        DispatcherSetable<?> setable = (DispatcherSetable<?>) object;
57                        setable.setDispatcher((Dispatcher) this);
58                }
59        }
60
61        public Object getRootObject() {
62                Object result = getAssignedRoot().getObject();
63                if (result == null) {
64                        throw new FramsticksException().msg("object tree is empty").arg("tree", this);
65                }
66                return result;
67        }
68
69        public <T> T getRootObject(Class<T> type) {
70                Object result = getRootObject();
71                if (!type.isInstance(result)) {
72                        throw new FramsticksException().msg("object tree holds object of different kind").arg("object", result).arg("requested", type).arg("tree", this);
73                }
74                return type.cast(result);
75        }
76
77        @Override
78        public void get(Path path, FutureHandler<Path> future) {
79                assert isActive();
80                log.debug("requesting: {}", path);
81                path = resolveTopSync(path);
82                future.pass(path);
83        }
84
85        // @Override
86        // public void get(Path path, ValueParam param, Future<Object> future) {
87        //      assert isActive();
88        //      path = resolveTopSync(path);
89        //      future.pass(bindAccess(path).get(param, Object.class));
90        // }
91
92        @Override
93        public <R> void call(Path path, ProcedureParam param, Object[] arguments, Class<R> resultType, FutureHandler<R> future) {
94                assert isActive();
95                try {
96                        Object result = bindAccess(path).call(param, arguments);
97                        future.pass(Casting.nullOrThrowCast(resultType, result));
98                } catch (FramsticksException e) {
99                        future.handle(e);
100                }
101        }
102
103        @Override
104        public void info(Path path, FutureHandler<FramsClass> future) {
105                assert isActive();
106                Path p = path.tryResolveIfNeeded();
107                Class<?> javaClass = p.getTopObject().getClass();
108                FramsClass framsClass = registry.registerReflectedIfNeeded(javaClass);
109                if (framsClass != null) {
110                        future.pass(framsClass);
111                } else {
112                        future.handle(new FramsticksException().msg("failed to find info for class").arg("java class", javaClass));
113                }
114        }
115
116        protected Path resolveTopSync(Path path) {
117                assert isActive();
118                assert path.isOwner(this);
119                if (path.getTop().getObject() != null) {
120                        return path;
121                }
122                Access access = bindAccess(path.getUnder());
123                Object object = access.get(path.getTop().getParam(), Object.class);
124                if (object == null) {
125                        throw new FramsticksException().msg("failed to resolve").arg("path", path);
126                }
127                return path.appendResolution(object);
128        }
129
130
131        @Override
132        public void set(Path path, PrimitiveParam<?> param, Object value, final FutureHandler<Integer> future) {
133                assert isActive();
134                future.pass(bindAccess(path).set(param, value));
135        }
136
137        public <A> void addListener(Path path, EventParam param, EventListener<A> listener, Class<A> argumentType, FutureHandler<Void> future) {
138                assert isActive();
139                try {
140                        bindAccess(path).reg(param, listener);
141                        future.pass(null);
142                } catch (FramsticksException e) {
143                        future.handle(e);
144                }
145        }
146
147        public void removeListener(Path path, EventParam param, EventListener<?> listener, FutureHandler<Void> future) {
148                assert isActive();
149                try {
150                        bindAccess(path).regRemove(param, listener);
151                        future.pass(null);
152                } catch (FramsticksException e) {
153                        future.handle(e);
154                }
155        }
156
157        @Override
158        protected void joinableStart() {
159                super.joinableStart();
160                if (joinableRootObject != null) {
161                        Dispatching.use(joinableRootObject, this);
162                }
163        }
164
165        @Override
166        protected void joinableInterrupt() {
167                if (joinableRootObject != null) {
168                        Dispatching.drop(joinableRootObject, this);
169                }
170                super.joinableInterrupt();
171        }
172
173        @Override
174        protected void joinableFinish() {
175                super.joinableFinish();
176        }
177
178        @Override
179        protected void joinableJoin() throws InterruptedException {
180                if (joinableRootObject != null) {
181                        Dispatching.join(joinableRootObject);
182                }
183                super.joinableJoin();
184        }
185
186        @Override
187        public void childChangedState(Joinable joinable, JoinableState state) {
188                super.childChangedState(joinable, state);
189                if (joinable == joinableRootObject) {
190                        proceedToState(state);
191                }
192        }
193
194}
Note: See TracBrowser for help on using the repository browser.