source: java/main/src/main/java/com/framsticks/core/LocalTree.java @ 103

Last change on this file since 103 was 103, checked in by psniegowski, 11 years ago

HIGHLIGHTS:

  • add auto loading and saving algorithms between

frams files format and Java classes

  • respect ValueChange? events in GUI (do not reload object)
  • support results of procedures in Java server
  • make Experiment automatically convert between frams file and NetFile? object
  • add MessageLogger? (compatible with original frams server messages)
  • WorkPackageLogic? now validates results, is able to discard them, reschedule

whole package, or only uncomputed remainder

CHANGELOG:
Show just a short description in PrimeExperiment?.

Add primes_changed event to the PrimeExperiment?.

Make WorkPackageLogic? robust to frams server returning invalid results.

Add MessageLogger? to logics.

Add NetFile? interface. Support Messages from server.

Minor changes to connections.

Merge results in the PrimeExperiment?.

More netload class->file conversion to Simulator.

Move netsave parsing to Simulator.

Fix bug with inverted ordering of events firing in Experiment.

Minor changes.

Minor logging changes.

Use AccessOperations?.convert in NetLoadSaveLogic?

NetLoadSaveLogic? now encloses the conversion.

Use more generic AccessOperations? saveAll and loadAll in PrimePackage?.

Add Result class for enclosing of call invocations' results.

Improve feature request handling in Connections.

Use AccessOperations?.convert in RemoteTree? events parsing.

Minor change.

Add some information params to Java server root and CLI objects.

A draft implementation of loadAll algorithm.

That algorithm tries to load objects into a tree structure.

Add AccessOperationsTest? test.

Develop WorkPackageLogic?.

  • add state tracking fields
  • add work package generation

Add utility class SimplePrimitive?.

Meant for Java backend classes, enclose a single primitive value
and set of listeners.

Improve primitive value refresh in GUI.

When ValueChange? found in called event, do not reload whole
object, but only update GUI (no communication is performed).

Use ValueChange? in the TestClass? test.

Minor changes.

Sending all packages in PrimeExperiment? to the frams servers.

Develop AccessOperations?.loadComposites().

Remove addAccess from MultiParamLoader? interface.

There is now no default AccessProvider? in MultiParamLoader?.
User must explicitely set AccessStash? or Registry.

Improve saving algorithms in AccessOperations?.

File size: 5.5 KB
Line 
1package com.framsticks.core;
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.Future;
21import com.framsticks.util.dispatching.Joinable;
22import com.framsticks.util.dispatching.JoinableState;
23import com.framsticks.util.lang.Casting;
24
25import static com.framsticks.core.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, Future<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, Future<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, Future<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 Future<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, Future<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, Future<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.