Update Server, breaks API + remove deprecated
[fanfix.git] / src / be / nikiroo / utils / serial / server / ServerString.java
1 package be.nikiroo.utils.serial.server;
2
3 import java.io.IOException;
4 import java.net.Socket;
5
6 import be.nikiroo.utils.Version;
7
8 /**
9 * This class implements a simple server that can listen for connections and
10 * send/receive Strings.
11 * <p>
12 * Note: this {@link ServerString} has to be discarded after use (cannot be
13 * started twice).
14 *
15 * @author niki
16 */
17 abstract public class ServerString extends Server {
18 /**
19 * Create a new server that will start listening on the network when
20 * {@link ServerString#start()} is called.
21 *
22 * @param port
23 * the port to listen on, or 0 to assign any unallocated port
24 * found (which can later on be queried via
25 * {@link ServerString#getPort()}
26 * @param ssl
27 * use a SSL connection (or not)
28 *
29 * @throws IOException
30 * in case of I/O error
31 */
32 public ServerString(int port, boolean ssl) throws IOException {
33 super(port, ssl);
34 }
35
36 /**
37 * Create a new server that will start listening on the network when
38 * {@link ServerString#start()} is called.
39 *
40 * @param name
41 * the server name (only used for debug info and traces)
42 * @param port
43 * the port to listen on
44 * @param ssl
45 * use a SSL connection (or not)
46 *
47 * @throws IOException
48 * in case of I/O error
49 */
50 public ServerString(String name, int port, boolean ssl) throws IOException {
51 super(name, port, ssl);
52 }
53
54 @Override
55 protected ConnectActionServer createConnectActionServer(Socket s) {
56 return new ConnectActionServerString(s) {
57 @Override
58 public void action(Version clientVersion) throws Exception {
59 try {
60 for (String data = rec(); data != null; data = rec()) {
61 String rep = null;
62 try {
63 rep = onRequest(this, clientVersion, data);
64 } catch (Exception e) {
65 onError(e);
66 }
67
68 if (rep == null) {
69 rep = "";
70 }
71
72 send(rep);
73 }
74 } catch (NullPointerException e) {
75 // Client has no data any more, we quit
76 getTraceHandler()
77 .trace(getName()
78 + ": client has data no more, stopping connection");
79 }
80 }
81
82 @Override
83 public void connect() {
84 try {
85 super.connect();
86 } finally {
87 count(-1);
88 }
89 }
90 };
91 }
92
93 /**
94 * This is the method that is called on each client request.
95 * <p>
96 * You are expected to react to it and return an answer (NULL will be
97 * converted to an empty {@link String}).
98 *
99 * @param action
100 * the client action
101 * @param clientVersion
102 * the client version
103 * @param data
104 * the data sent by the client
105 *
106 * @return the answer to return to the client
107 *
108 * @throws Exception
109 * in case of an exception, the error will only be logged
110 */
111 abstract protected String onRequest(ConnectActionServerString action,
112 Version clientVersion, String data) throws Exception;
113 }