source: java/main/src/main/java/com/framsticks/gui/console/ManagedConsole.java @ 105

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

HIGHLIGHTS:

  • import refactorization: move Tree, Path, etc.

from core to structure package

  • initial serialization implementation
  • improve PrimeExperiment? test
  • many organizational changes and convenience improvements

CHANGELOG:
Make registry in AbstractTree? final.

Move most classes from core to structure package.

Minor changes.

Switch names of Future and FutureHandler?.

Rename ExceptionResultHandler? to ExceptionHandler?.

Rename ExceptionHandler? to ExceptionDispatcherHandler?.

Fix bug in ParamCandidate? cache.

Add missing synchronization to the BufferedDispatcher?.

Develop @Serialized support.

Rework serialization further.

Add serialization/deserialization interface to ValueParam?.

Move getStorageType and isNumeric from Param down to params hierarchy.

Minor changes.

Improve param type induction.

Add TestSerializedClass? for testing new serialization.

Add info files gor GenePool? and Population.

Add standard.expt exemplary netfile.

Add type name field to PropertiesObject?.

Use PropertiesObject? for PropertiesAccess? instead of ordinary map.

Hide getFramsClass is several more places.

More unification accross FramsClass?, Access and Path.

Add ParamCollection?.

Simplify interface for getting params from FramsClass?, Access
or Path.

Make Access.call() interface variadic.

Add arguments(args) convenience wrapper around new Object[] {args}.

Upgrade to apache.commons.lang version 3.1

Minor improvement with Response constructors.

Develop proper result printing in ClientAtServer?.

Add experimentNetsave to PrimeExperiment?.

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