package uk.ac.cam.echo.server;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.module.SimpleModule;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.CommonProperties;
import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.media.sse.SseFeature;
import org.glassfish.jersey.server.ResourceConfig;
import uk.ac.cam.echo.data.*;
import uk.ac.cam.echo.server.filters.HibernateRequestFilter;
import uk.ac.cam.echo.server.filters.HibernateResponseFilter;
import uk.ac.cam.echo.server.filters.JacksonWithHibernateJsonProvider;
import uk.ac.cam.echo.server.models.*;
import uk.ac.cam.echo.server.resources.ConferenceResourceImpl;
import uk.ac.cam.echo.server.resources.ConversationResourceImpl;
import uk.ac.cam.echo.server.resources.MessageResourceImpl;
import uk.ac.cam.echo.server.resources.UserResourceImpl;
import javax.ws.rs.core.UriBuilder;
import java.io.IOException;
import java.net.URI;
/**
* Main class.
*
*/
public class Main {
// Base URI the Grizzly HTTP server will listen on
public static String BASE_URI = "http://localhost:8080/";
/**
* Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.
* @return Grizzly HTTP server.
*/
public static URI getUri() {
int port;
try {
port = Integer.valueOf(System.getenv("PORT"));
} catch (Exception e) {
port = 8080;
}
return UriBuilder.fromUri("http://0.0.0.0/").port(port).build();
}
private static JacksonJaxbJsonProvider getJsonProvider() {
ObjectMapper mapper = new ObjectMapper();
SimpleModule testModule = new SimpleModule("testModule", new Version(1,0,0,null))
.addAbstractTypeMapping(Conference.class, ConferenceModel.class)
.addAbstractTypeMapping(Conversation.class, ConversationModel.class)
.addAbstractTypeMapping(Message.class, MessageModel.class)
.addAbstractTypeMapping(Tag.class, TagModel.class)
.addAbstractTypeMapping(Interest.class, InterestModel.class)
.addAbstractTypeMapping(User.class, UserModel.class);
mapper.registerModule(testModule);
JacksonJaxbJsonProvider provider = new JacksonWithHibernateJsonProvider();
provider.setMapper(mapper);
return provider;
}
public static HttpServer startServer() {
// create a resource config that scans for JAX-RS resources and providers
// in uk.ac.cam.echo package
HibernateUtil.getSessionFactory();
final ResourceConfig rc = new ResourceConfig().packages("uk.ac.cam.echo.server");
rc.register(UserResourceImpl.class);
rc.register(MessageResourceImpl.class);
rc.register(ConversationResourceImpl.class);
rc.register(ConferenceResourceImpl.class);
rc.register(HibernateRequestFilter.class);
rc.register(HibernateResponseFilter.class);
final String disableMoxy = CommonProperties.MOXY_JSON_FEATURE_DISABLE + '.'
+ rc.getRuntimeType().name().toLowerCase();
rc.property(disableMoxy, true);
rc.register(getJsonProvider());
rc.register(LoggingFilter.class);
rc.register(SseFeature.class);
// create and start a new instance of grizzly http server
// exposing the Jersey application at BASE_URI
return GrizzlyHttpServerFactory.createHttpServer(getUri(), rc);
}
/**
* Main method.
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
final HttpServer server = startServer();
System.out.println(String.format("Jersey app started with WADL available at "
+ "%sapplication.wadl\nHit enter to stop it...", BASE_URI));
while(true) {
System.in.read();
}
}
}