source: java/main/src/main/java/com/framsticks/hosting/InstanceClient.java @ 88

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

HIGHLIGHTS:

  • loading f0 schema with XmlLoader?
  • use XmlLoader? to load configuration
  • introduce unified fork-join model of various entities

(Instances, Connections, GUI Frames, etc.),
all those entities clean up gracefully on
shutdown, which may be initialized by user
or by some entity

  • basing on above, simplify several organizing classes

(Observer, main class)

(to host native frams server process from Java level)

CHANGELOG:
Remove redundant Observer class.

Clean up in AbstractJoinable?.

Update ExternalProcess? class to changes in joining model.

Another sweep through code with FindBugs?.

Find bug with not joining RemoteInstance?.

Joining almost works.

Much improved joining model.

More improvement to joining model.

Add logging messages around joinable operations.

Rename methods in AbstractJoinable?.

Improve Joinable.

Rewrite of entity structure.

More simplifications with entities.

Further improve joinables.

Let Frame compose from JFrame instead of inheriting.

Add join classes.

Improvements of closing.

Add Builder interface.

Add FramsServerTest?.xml

FramsServer? may be configured through xml.

Make Framsticks main class an Observer of Entities.

Make Observer a generic type.

Remove variables regarding to removed endpoint.

Simplify observer (remove endpoints).

More changes to Observer and Endpoint.

Minor improvements.

Add OutputListener? to ExternalProcess?.

Improve testing of ExternalProcess?.

Add ExternalProcess? runner.

Rename the Program class to Framsticks.

Migrate Program to use XmlLoader? configuration.

First steps with configuration using XmlLoader?.

Fix several bugs.

Move all f0 classes to apriopriate package.

XmlLoader? is able to load Schema.

XmlLoader? is loading classes and props.

Add GroupBuilder?.

File size: 3.7 KB
Line 
1package com.framsticks.hosting;
2
3import com.framsticks.communication.*;
4import com.framsticks.communication.queries.ApplicationRequest;
5import com.framsticks.communication.queries.GetRequest;
6import com.framsticks.communication.queries.InfoRequest;
7import com.framsticks.core.Instance;
8import com.framsticks.core.Path;
9import com.framsticks.params.*;
10import com.framsticks.parsers.Savers;
11import com.framsticks.core.LocalInstance;
12import com.framsticks.util.dispatching.AbstractJoinable;
13import com.framsticks.util.dispatching.Dispatching;
14import com.framsticks.util.dispatching.Future;
15import com.framsticks.util.dispatching.Joinable;
16import com.framsticks.util.dispatching.JoinableParent;
17import com.framsticks.util.dispatching.JoinableState;
18
19import java.net.Socket;
20import java.util.ArrayList;
21import java.util.LinkedList;
22import java.util.List;
23import com.framsticks.util.dispatching.RunAt;
24
25/**
26 * @author Piotr Sniegowski
27 */
28public class InstanceClient extends AbstractJoinable implements RequestHandler, JoinableParent {
29
30        protected final LocalInstance instance;
31        protected final ServerConnection connection;
32
33        public InstanceClient(LocalInstance instance, Socket socket) {
34                this.instance = instance;
35                connection = new ServerConnection(socket, this);
36        }
37
38        @Override
39        public String toString() {
40                return instance + "|" + connection.toString();
41        }
42
43        @Override
44        public void handle(final ApplicationRequest request, final ResponseCallback<?> responseCallback) {
45                instance.invokeLater(new RunAt<Instance>() {
46                        @Override
47                        public void run() {
48                                final Path path = instance.getPath(request.getPath());
49                                if (!path.isResolved(request.getPath())) {
50                                        responseCallback.process(new Response(false, "\"invalid path\"", null));
51                                        return;
52                                }
53                                if (request instanceof GetRequest) {
54                                        instance.findInfo(path, new Future<FramsClass>() {
55                                                @Override
56                                                public void result(FramsClass result, Exception e) {
57                                                        if (result == null) {
58                                                                responseCallback.process(new Response(false, "\"failed to find info for access bind\"", null));
59                                                                return;
60                                                        }
61                                                        List<File> files = new LinkedList<File>();
62                                                        AccessInterface access = instance.bindAccess(path);
63
64                                                        if (access == null) {
65
66                                                                responseCallback.process(new Response(false, "\"failed to bind access\"", null));
67                                                                return;
68                                                        }
69                                                        ListSink sink = new ListSink();
70                                                        access.save(sink);
71                                                        files.add(new File(path.getTextual(), new ListSource(sink.getOut())));
72                                                        responseCallback.process(new Response(true, "", files));
73                                                }
74                                        });
75                                        return;
76                                }
77                                if (request instanceof InfoRequest) {
78                                        instance.findInfo(path, new Future<FramsClass>() {
79                                                @Override
80                                                public void result(FramsClass result, Exception e) {
81                                                        if (result == null) {
82                                                                responseCallback.process(new Response(false, "\"info not found\"", null));
83                                                                return;
84                                                        }
85                                                        ListSink sink = new ListSink();
86                                                        Savers.saveFramsClass(sink, result);
87                                                        List<File> files = new ArrayList<File>();
88                                                        files.add(new File(path.getTextual(), new ListSource(sink.getOut())));
89                                                        responseCallback.process(new Response(true, null, files));
90                                                }
91                                        });
92                                        return;
93                                }
94                                responseCallback.process(new Response(false, "invalid", null));
95                        }
96                });
97
98        }
99
100        @Override
101        protected void joinableStart() {
102                Dispatching.use(connection, this);
103        }
104
105        @Override
106        protected void joinableInterrupt() {
107                Dispatching.drop(connection, this);
108        }
109
110        @Override
111        protected void joinableFinish() {
112        }
113
114        @Override
115        protected void joinableJoin() throws InterruptedException {
116                Dispatching.join(connection);
117        }
118
119        @Override
120        public void childChangedState(Joinable joinable, JoinableState state) {
121                proceedToState(state);
122        }
123
124}
Note: See TracBrowser for help on using the repository browser.