SCL REST API server
[simantics/platform.git] / bundles / org.simantics.scl.rest / src / org / simantics / scl / rest / SCLRESTServer.java
1 package org.simantics.scl.rest;
2
3 import org.eclipse.jetty.server.Connector;
4 import org.eclipse.jetty.server.Server;
5 import org.eclipse.jetty.server.ServerConnector;
6 import org.eclipse.jetty.servlet.ServletContextHandler;
7 import org.eclipse.jetty.servlet.ServletHolder;
8 import org.glassfish.jersey.jackson.JacksonFeature;
9 import org.glassfish.jersey.media.multipart.MultiPartFeature;
10 import org.glassfish.jersey.server.ResourceConfig;
11 import org.glassfish.jersey.servlet.ServletContainer;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
14
15 public class SCLRESTServer {
16
17     private static final Logger LOGGER = LoggerFactory.getLogger(SCLRESTServer.class);
18     
19     private static SCLRESTServer INSTANCE = null;
20     private static Server server;
21     private static ServiceServerThread serverThread;
22
23     private SCLRESTServer(String token, int preferablePort) {
24         ResourceConfig config = new ResourceConfig();
25         // JSON serialization/deserialization
26         config.register(JacksonFeature.class);
27         // File upload
28         config.register(MultiPartFeature.class);
29         // Actual API
30         config.register(SCLRESTAPI.class);
31         // Authorization
32         config.register(new AuthorizationFilter(token));
33         
34         ServletHolder holder = new ServletHolder(new ServletContainer(config));
35         
36         server = new Server();
37         ServerConnector connector = new ServerConnector(server);
38         connector.setPort(preferablePort);
39         connector.setHost("localhost");
40         
41         server.setConnectors(new Connector[] { connector });
42         
43         ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
44         context.addServlet(holder, "/*");
45     }
46     
47     private static class ServiceServerThread extends Thread {
48
49         @Override
50         public void run() {
51             try {
52                 server.start();
53                 server.join();
54             } catch (Exception e) {
55                 LOGGER.error("Could not start server ", e);
56             }
57         }
58     }
59
60     private static synchronized SCLRESTServer getInstance(String token, int port) {
61         try {
62             if (INSTANCE == null) {
63                 INSTANCE = new SCLRESTServer(token, port);
64             }
65         } catch (Exception e) {
66             LOGGER.error("Could not initialize SCL REST server", e);
67         }
68         return INSTANCE;
69     }
70
71     public static synchronized void start(String token, int port) throws Exception {
72         // Ensure that an instance is created
73         getInstance(token, port);
74         if (serverThread == null && server != null) {
75             serverThread = new ServiceServerThread();
76             serverThread.start();
77         }
78     }
79     
80     public static synchronized void stop() throws Exception {
81         if (server != null)
82             server.stop();
83         serverThread = null;
84     }
85 }