package org.cytoscape.rest.internal.task;
import java.net.URI;
import java.util.Properties;
import javax.ws.rs.core.UriBuilder;
import org.cytoscape.property.CyProperty;
import org.cytoscape.rest.internal.commands.resources.CommandResource;
import org.cytoscape.rest.internal.resource.AlgorithmicResource;
import org.cytoscape.rest.internal.resource.GlobalTableResource;
import org.cytoscape.rest.internal.resource.GroupResource;
import org.cytoscape.rest.internal.resource.MiscResource;
import org.cytoscape.rest.internal.resource.NetworkFullResource;
import org.cytoscape.rest.internal.resource.NetworkResource;
import org.cytoscape.rest.internal.resource.NetworkNameResource;
import org.cytoscape.rest.internal.resource.NetworkViewResource;
import org.cytoscape.rest.internal.resource.RootResource;
import org.cytoscape.rest.internal.resource.SessionResource;
import org.cytoscape.rest.internal.resource.StyleResource;
import org.cytoscape.rest.internal.resource.TableResource;
import org.cytoscape.rest.internal.resource.UIResource;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.hk2.utilities.Binder;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Task to start Grizzly server.
*
*/
public final class GrizzlyServerManager {
private final static Logger logger = LoggerFactory.getLogger(GrizzlyServerManager.class);
public static final String PORT_NUMBER_PROP = "rest.port";
public static final Integer DEF_PORT_NUMBER = 1234;
private String baseURL = "http://0.0.0.0";
private Integer portNumber = DEF_PORT_NUMBER;
private final Binder binder;
private HttpServer server = null;
public GrizzlyServerManager(final Binder binder, CyProperty<Properties> props) {
this.binder = binder;
// Get property from property
Object portNumberProp = props.getProperties().get(PORT_NUMBER_PROP);
if(portNumberProp != null) {
try {
portNumber = Integer.parseInt(portNumberProp.toString());
} catch(Exception ex) {
portNumber = DEF_PORT_NUMBER;
}
}
}
public void startServer() throws Exception {
if (server == null) {
final URI baseURI = UriBuilder.fromUri(baseURL).port(portNumber).build();
final ResourceConfig rc = new ResourceConfig(
RootResource.class,
NetworkResource.class,
NetworkFullResource.class,
NetworkViewResource.class,
TableResource.class,
MiscResource.class,
AlgorithmicResource.class,
StyleResource.class,
GroupResource.class,
GlobalTableResource.class,
SessionResource.class,
NetworkNameResource.class,
UIResource.class,
// For Commands
CommandResource.class);
rc.registerInstances(binder).packages("org.glassfish.jersey.examples.jackson")
.register(JacksonFeature.class);
this.server = GrizzlyHttpServerFactory.createHttpServer(baseURI, rc);
logger.info("========== Cytoscape RESTful API service started. Listening at port: " + portNumber + " ==============");
}
}
public void stopServer() {
if(this.server != null) {
this.server.shutdown();
}
}
}