source: java/main/src/main/java/com/framsticks/experiment/Simulator.java @ 102

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

HIGHLIGHTS:

for Joinables running

CHANGELOG:
Add WorkPackageLogic? and classes representing prime experiment state.

Add classes for PrimeExperiment? state.

Extract single netload routine in Simulator.

Working netload with dummy content in PrimeExperiment?.

More development with NetLoadSaveLogic? and PrimeExperiment?.

Improvement around prime.

Improve BufferedDispatcher?.isActive logic.

Add prime-all.xml configuration.

Manual connecting to existing simulators from GUI.

Guard in SimulatorConnector? against expdef mismatch.

Guard against empty target dispatcher in BufferedDispatcher?.

Make BufferedDispatcher? a Dispatcher (and Joinable).

Minor improvements.

Done StackedJoinable?, improve Experiment.

Develop StackedJoinable?.

Add StackedJoinable? utility joinables controller.

Add dependency on apache-commons-lang.

Add ready ListChange? on Simulators.

Improve hints in ListChange?.

Several improvements.

Found bug with dispatching in Experiment.

Minor improvements.

Fix bug with early finishing Server.

Many changes in Dispatching.

Fix bug with connection.

Do not obfuscate log with socket related exceptions.

Add SocketClosedException?.

Add SimulatorConnector?.

Work out conception of experiment composing of logics building blocks.

Rename SinkInterface? to Sink.

Move saving of Accesses into AccessOperations?.

Some improvements to Experiment.

Improve joinables.

Fix issue with joinables closing.

Add direct and managed consoles to popup menu.

File size: 6.0 KB
Line 
1package com.framsticks.experiment;
2
3import com.framsticks.communication.File;
4import com.framsticks.communication.queries.NeedFile;
5import com.framsticks.communication.queries.NeedFileAcceptor;
6import com.framsticks.core.Path;
7import com.framsticks.core.Tree;
8import com.framsticks.core.ValueChange;
9import com.framsticks.params.EventListener;
10import com.framsticks.params.FramsClass;
11import com.framsticks.params.UniqueObject;
12import com.framsticks.params.annotations.FramsClassAnnotation;
13import com.framsticks.params.annotations.ParamAnnotation;
14import com.framsticks.params.types.EventParam;
15import com.framsticks.params.types.ProcedureParam;
16import com.framsticks.remote.RemoteTree;
17import com.framsticks.util.FramsticksException;
18import com.framsticks.util.dispatching.AbstractJoinable;
19import com.framsticks.util.dispatching.Dispatcher;
20import com.framsticks.util.dispatching.Dispatching;
21import com.framsticks.util.dispatching.ExceptionResultHandler;
22import com.framsticks.util.dispatching.Future;
23import com.framsticks.util.dispatching.FutureHandler;
24import com.framsticks.util.dispatching.Joinable;
25import com.framsticks.util.dispatching.JoinableParent;
26import com.framsticks.util.dispatching.JoinableState;
27import com.framsticks.util.dispatching.RunAt;
28import com.framsticks.util.dispatching.ThrowExceptionHandler;
29import com.framsticks.util.lang.Holder;
30import java.util.concurrent.atomic.AtomicInteger;
31import org.apache.logging.log4j.LogManager;
32import org.apache.logging.log4j.Logger;
33import static com.framsticks.core.TreeOperations.*;
34
35@FramsClassAnnotation
36public final class Simulator extends AbstractJoinable implements Dispatcher<Simulator>, JoinableParent, UniqueObject, ExceptionResultHandler {
37
38        private static final Logger log = LogManager.getLogger(Simulator.class);
39
40        protected String uid;
41
42        protected final RemoteTree remoteTree;
43        protected final Path simulatorPath;
44        protected final FramsClass simulatorClass;
45        protected final Experiment experiment;
46        protected final EventListener<ValueChange> runningListener;
47
48        /**
49         *
50         */
51        public Simulator(Experiment experiment, RemoteTree remoteTree, Path simulatorPath) {
52                super();
53                this.remoteTree = remoteTree;
54                this.simulatorPath = simulatorPath.assureResolved();
55                this.experiment = experiment;
56                this.simulatorClass = getFramsClass(simulatorPath);
57
58                assert remoteTree.isActive();
59                assert experiment.isActive();
60
61                log.debug("simulator ready {}", this);
62
63                runningListener = new EventListener<ValueChange>() {
64                        @Override
65                        public void action(ValueChange argument) {
66                                log.debug("running state of {} changed: {}", this, argument);
67                        }
68                };
69
70                addListener(simulatorPath, simulatorClass.getParamEntry("running_changed", EventParam.class), runningListener, ValueChange.class, new FutureHandler<Void>(this) {
71                        @Override
72                        protected void result(Void result) {
73                                log.debug("running listener for {} registered", this);
74                        }
75                });
76        }
77
78        @ParamAnnotation
79        public String getAddress() {
80                return remoteTree.getAddress();
81        }
82
83        @Override
84        @ParamAnnotation
85        public String getName() {
86                return getAddress();
87        }
88
89        @Override
90        @ParamAnnotation
91        public String getUid() {
92                return uid;
93        }
94
95        @Override
96        public void setUid(String uid) {
97                this.uid = uid;
98        }
99
100        /**
101         * @return the tree
102         */
103        @ParamAnnotation
104        public RemoteTree getRemoteTree() {
105                return remoteTree;
106        }
107
108        /**
109         * @return the simulatorPath
110         */
111        public Path getSimulatorPath() {
112                return simulatorPath;
113        }
114
115        /**
116         * @return the simulatorClass
117         */
118        public FramsClass getSimulatorClass() {
119                return simulatorClass;
120        }
121
122        @Override
123        protected void joinableStart() {
124                Dispatching.use(remoteTree, this);
125        }
126
127        @Override
128        protected void joinableInterrupt() {
129                Dispatching.drop(remoteTree, this);
130
131        }
132
133        @Override
134        protected void joinableFinish() {
135
136        }
137
138        @Override
139        protected void joinableJoin() throws InterruptedException {
140                Dispatching.join(remoteTree);
141        }
142
143        @ParamAnnotation(paramType = ProcedureParam.class)
144        public void init() {
145        }
146
147        @ParamAnnotation(paramType = ProcedureParam.class)
148        public void start() {
149        }
150
151        @ParamAnnotation(paramType = ProcedureParam.class)
152        public void stop() {
153        }
154
155        @ParamAnnotation(paramType = ProcedureParam.class)
156        public void abort() {
157                assert isActive();
158                log.debug("explicitly aborting {}", this);
159                experiment.removeSimulator(this);
160                interruptJoinable();
161        }
162
163        @Override
164        public void childChangedState(Joinable joinable, JoinableState state) {
165                proceedToState(state);
166        }
167
168        @Override
169        public void handle(FramsticksException exception) {
170                experiment.handle(new FramsticksException().msg("exception caught in simulator").arg("simulator", this).cause(exception));
171        }
172
173        @Override
174        public boolean isActive() {
175                return experiment.isActive();
176        }
177
178        @SuppressWarnings({ "rawtypes", "unchecked" })
179        @Override
180        public void dispatch(RunAt<? extends Simulator> runnable) {
181                experiment.dispatch((RunAt) runnable);
182        }
183
184        protected final AtomicInteger netloadIdCounter = new AtomicInteger();
185
186        public void uploadNet(final File file, final Future<Object> future) {
187                final String netloadId = "NetLoadSaveLogic" + netloadIdCounter.getAndIncrement();
188
189                log.debug("uploading file {} to {} identified by {}", file, simulatorPath, netloadId);
190
191                final Holder<NeedFileAcceptor> acceptor = new Holder<>();
192                final Tree tree = simulatorPath.getTree();
193
194                acceptor.set(new NeedFileAcceptor() {
195
196                        @Override
197                        public boolean acceptNeed(NeedFile needFile) {
198                                if (!needFile.getDescription().equals(netloadId)) {
199                                        return false;
200                                }
201                                log.debug("accepting netload {}", netloadId);
202                                needFile.getFuture().pass(file);
203                                tree.dispatch(new RunAt<Tree>(ThrowExceptionHandler.getInstance()) {
204
205                                        @Override
206                                        protected void runAt() {
207                                                tree.removeNeedFileAcceptor(acceptor.get());
208                                        }
209                                });
210                                return true;
211                        }
212
213                });
214
215                simulatorPath.getTree().addNeedFileAcceptor(Integer.MIN_VALUE, acceptor.get());
216
217                call(simulatorPath, getFramsClass(simulatorPath).getParamEntry("netload_id", ProcedureParam.class), new Object[] { netloadId }, new FutureHandler<Object>(future) {
218
219                        @Override
220                        protected void result(Object result) {
221                                log.debug("upload of {} done", file);
222                                future.pass(result);
223                        }
224                });
225
226        }
227}
Note: See TracBrowser for help on using the repository browser.