package com.framsticks.hosting; import com.framsticks.communication.*; import com.framsticks.communication.queries.ApplicationRequest; import com.framsticks.communication.queries.GetRequest; import com.framsticks.communication.queries.InfoRequest; import com.framsticks.core.Instance; import com.framsticks.core.Path; import com.framsticks.params.*; import com.framsticks.parsers.Savers; import com.framsticks.core.LocalInstance; import com.framsticks.util.dispatching.AbstractJoinable; import com.framsticks.util.dispatching.Dispatching; import com.framsticks.util.dispatching.Future; import com.framsticks.util.dispatching.Joinable; import com.framsticks.util.dispatching.JoinableParent; import com.framsticks.util.dispatching.JoinableState; import java.net.Socket; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import com.framsticks.util.dispatching.RunAt; /** * @author Piotr Sniegowski */ public class InstanceClient extends AbstractJoinable implements RequestHandler, JoinableParent { protected final LocalInstance instance; protected final ServerConnection connection; public InstanceClient(LocalInstance instance, Socket socket) { this.instance = instance; connection = new ServerConnection(socket, this); } @Override public String toString() { return instance + "|" + connection.toString(); } @Override public void handle(final ApplicationRequest request, final ResponseCallback responseCallback) { instance.invokeLater(new RunAt() { @Override public void run() { final Path path = instance.getPath(request.getPath()); if (!path.isResolved(request.getPath())) { responseCallback.process(new Response(false, "\"invalid path\"", null)); return; } if (request instanceof GetRequest) { instance.findInfo(path, new Future() { @Override public void result(FramsClass result, Exception e) { if (result == null) { responseCallback.process(new Response(false, "\"failed to find info for access bind\"", null)); return; } List files = new LinkedList(); AccessInterface access = instance.bindAccess(path); if (access == null) { responseCallback.process(new Response(false, "\"failed to bind access\"", null)); return; } ListSink sink = new ListSink(); access.save(sink); files.add(new File(path.getTextual(), new ListSource(sink.getOut()))); responseCallback.process(new Response(true, "", files)); } }); return; } if (request instanceof InfoRequest) { instance.findInfo(path, new Future() { @Override public void result(FramsClass result, Exception e) { if (result == null) { responseCallback.process(new Response(false, "\"info not found\"", null)); return; } ListSink sink = new ListSink(); Savers.saveFramsClass(sink, result); List files = new ArrayList(); files.add(new File(path.getTextual(), new ListSource(sink.getOut()))); responseCallback.process(new Response(true, null, files)); } }); return; } responseCallback.process(new Response(false, "invalid", null)); } }); } @Override protected void joinableStart() { Dispatching.use(connection, this); } @Override protected void joinableInterrupt() { Dispatching.drop(connection, this); } @Override protected void joinableFinish() { } @Override protected void joinableJoin() throws InterruptedException { Dispatching.join(connection); } @Override public void childChangedState(Joinable joinable, JoinableState state) { proceedToState(state); } }