source: java/main/src/main/java/com/framsticks/gui/console/ManagedConsole.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: 5.2 KB
Line 
1package com.framsticks.gui.console;
2
3import java.util.LinkedList;
4import java.util.List;
5
6import com.framsticks.communication.ClientSideManagedConnection;
7import com.framsticks.communication.ClientSideResponseFuture;
8import com.framsticks.communication.File;
9import com.framsticks.communication.Request;
10import com.framsticks.communication.Response;
11import com.framsticks.communication.queries.ApplicationRequest;
12import com.framsticks.core.Path;
13import static com.framsticks.core.TreeOperations.*;
14import com.framsticks.gui.SwingDispatcher;
15import com.framsticks.params.CompositeParam;
16import com.framsticks.params.annotations.AutoAppendAnnotation;
17import com.framsticks.params.annotations.FramsClassAnnotation;
18import com.framsticks.params.types.ListParam;
19import com.framsticks.remote.RemoteTree;
20import com.framsticks.util.FramsticksException;
21import com.framsticks.util.dispatching.Dispatching;
22import com.framsticks.util.dispatching.FutureHandler;
23import com.framsticks.util.dispatching.RunAt;
24import com.framsticks.util.lang.Casting;
25import com.framsticks.util.lang.Containers;
26import com.framsticks.util.lang.Pair;
27import com.framsticks.util.lang.Strings;
28
29@FramsClassAnnotation
30public class ManagedConsole extends InteractiveConsole {
31
32
33        protected RemoteTree tree;
34
35        /**
36         * @param connection
37         */
38        public ManagedConsole() {
39        }
40
41        /**
42         * @return the connection
43         */
44        @Override
45        public ClientSideManagedConnection getConnection() {
46                return (ClientSideManagedConnection) connection;
47        }
48
49
50        protected void sendImplementation(String line) {
51                if (!connection.isConnected()) {
52                        throw new FramsticksException().msg("not connected").arg("console", this);
53                }
54                //Move that to managed connection
55                ApplicationRequest request;
56                try {
57                        Pair<String, String> command = Strings.splitIntoPair(line, ' ', "");
58                        request = Casting.throwCast(ApplicationRequest.class, Request.createRequestByTypeString(command.first));
59                        request.parseRest(command.second);
60                } catch (FramsticksException e) {
61                        throw new FramsticksException().msg("invalid line").arg("line", line).cause(e);
62                }
63
64                paintLine(line);
65
66                getConnection().send(request, SwingDispatcher.getInstance(), new ClientSideResponseFuture(this) {
67                        @Override
68                        protected void processOk(Response response) {
69                                for (File f : response.getFiles()) {
70                                        consolePainter.paintMessage(f);
71                                }
72                        }
73                });
74        }
75
76
77        @Override
78        protected void findCompletionPropositions(final String prefix) {
79                Pair<CharSequence, CharSequence> command = Request.takeIdentifier(prefix);
80                if (command == null) {
81                        return;
82                }
83
84                Casting.throwCast(ApplicationRequest.class, Request.createRequestByTypeString(command.first.toString()));
85                // Pair<String, String> rest = Strings
86                Pair<CharSequence, CharSequence> rest = Request.takeIdentifier(command.second);
87                if (rest == null) {
88                        List<String> propositions = new LinkedList<String>();
89                        propositions.add(command.first.toString() + " /");
90                        processCompletionResult(prefix, propositions);
91                        return;
92                }
93
94                final String textual = rest.first.toString();
95                if (!textual.startsWith("/")) {
96                        throw new FramsticksException().msg("invalid line").arg("line", prefix);
97                }
98                // final Iterator<String> iterator = Path.splitPath(textual);
99
100                tryGet(tree, textual, new FutureHandler<Path>(this) {
101
102                        @Override
103                        protected void result(final Path path) {
104                                if (!textual.startsWith(path.getTextual())) {
105                                        throw new FramsticksException().msg("invalid state").arg("line", prefix).arg("path", path);
106                                }
107                                assert path.getTree().isActive();
108
109                                final Runnable finalizeCompletion = new Runnable() {
110                                        @Override
111                                        public void run() {
112                                                String remaining = textual.substring(path.getTextual().length());
113
114                                                String base = prefix.substring(0, prefix.length() - (textual.length() - path.getTextual().length()));
115                                                if (path.size() > 1) {
116                                                        base = base + "/";
117                                                }
118
119                                                if (remaining.startsWith("/")) {
120                                                        remaining = remaining.substring(1);
121                                                }
122
123                                                if (remaining.indexOf('/') != -1) {
124                                                        /** It is to long. */
125                                                        return;
126                                                }
127                                                final List<String> propositions = new LinkedList<String>();
128                                                for (CompositeParam p : Containers.filterInstanceof(bindAccess(path).getParams(), CompositeParam.class)) {
129                                                        if (remaining.equals("") || p.getId().startsWith(remaining)) {
130                                                                propositions.add(base + p.getId());
131                                                        }
132                                                }
133
134                                                dispatch(new RunAt<ManagedConsole>(ManagedConsole.this) {
135
136                                                        @Override
137                                                        protected void runAt() {
138                                                                processCompletionResult(prefix, propositions);
139                                                        }
140                                                });
141                                        }
142                                };
143
144                                if (path.getTop().getParam() instanceof ListParam) {
145                                        tree.get(path, new FutureHandler<Path>(ManagedConsole.this) {
146                                                @Override
147                                                protected void result(Path result) {
148                                                        finalizeCompletion.run();
149                                                }
150                                        });
151                                        return;
152                                }
153                                finalizeCompletion.run();
154
155                        }
156                });
157
158
159        }
160
161        @AutoAppendAnnotation
162        public ManagedConsole setTree(RemoteTree tree) {
163                this.tree = tree;
164                connection = tree.getConnection();
165                return this;
166        }
167
168        @Override
169        protected void joinableStart() {
170                super.joinableStart();
171                Dispatching.use(tree, this);
172        }
173
174        @Override
175        protected void joinableInterrupt() {
176                Dispatching.drop(tree, this);
177                super.joinableInterrupt();
178        }
179
180        @Override
181        protected void joinableJoin() throws InterruptedException {
182                Dispatching.join(tree);
183                super.joinableJoin();
184        }
185}
Note: See TracBrowser for help on using the repository browser.