package fr.openwide.core.rest.jersey.test.util; import java.io.IOException; import java.net.URI; import javax.ws.rs.core.UriBuilder; import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter; import org.springframework.util.StringUtils; import org.springframework.web.context.ContextLoader; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; import com.sun.grizzly.http.SelectorThread; import com.sun.grizzly.http.servlet.ServletAdapter; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.container.filter.LoggingFilter; import com.sun.jersey.api.container.grizzly.GrizzlyServerFactory; import com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider; import com.sun.jersey.spi.container.servlet.ServletContainer; import com.sun.jersey.spi.spring.container.servlet.SpringServlet; import fr.openwide.core.spring.config.ExtendedApplicationContextInitializer; public final class RestTestUtils { public static SelectorThread getSelectorThread(Class<?> applicationConfigClass, String testServerUri, int testServerPort, String testContextPath, String testServletPath, String[] springContextFiles, boolean enableJPA) throws IllegalArgumentException, IOException { final URI baseUri = UriBuilder.fromUri(testServerUri).port(testServerPort).build(); final ServletAdapter adapter = initRestTestServletAdapter(applicationConfigClass, testServerPort, testContextPath, testServletPath, enableJPA); adapter.addContextParameter(ContextLoader.CONFIG_LOCATION_PARAM, StringUtils.arrayToCommaDelimitedString(springContextFiles)); return GrizzlyServerFactory.create(baseUri, adapter); } public static SelectorThread getSelectorThread(Class<?> applicationConfigClass, String testServerUri, int testServerPort, String testContextPath, String testServletPath, Class<?> javaConfigClass, boolean enableJPA) throws IllegalArgumentException, IOException { final URI baseUri = UriBuilder.fromUri(testServerUri).port(testServerPort).build(); final ServletAdapter adapter = initRestTestServletAdapter(applicationConfigClass, testServerPort, testContextPath, testServletPath, enableJPA); adapter.addContextParameter(ContextLoader.CONTEXT_CLASS_PARAM, AnnotationConfigWebApplicationContext.class.getName()); adapter.addContextParameter(ContextLoader.CONTEXT_INITIALIZER_CLASSES_PARAM, ExtendedApplicationContextInitializer.class.getName()); adapter.addContextParameter(ContextLoader.CONFIG_LOCATION_PARAM, javaConfigClass.getName()); return GrizzlyServerFactory.create(baseUri, adapter); } public static ServletAdapter initRestTestServletAdapter(Class<?> applicationConfigClass, int testServerPort, String testContextPath, String testServletPath, boolean enableJPA) { final ServletAdapter adapter = new ServletAdapter(); adapter.addInitParameter(ServletContainer.APPLICATION_CONFIG_CLASS, applicationConfigClass.getName()); adapter.addInitParameter("com.sun.jersey.spi.container.ContainerRequestFilters", LoggingFilter.class.getName()); adapter.addInitParameter("com.sun.jersey.spi.container.ContainerResponseFilters", LoggingFilter.class.getName()); adapter.addServletListener(ContextLoaderListener.class.getName()); if (enableJPA) { adapter.addFilter(new OpenEntityManagerInViewFilter(), "openEntityManagerInViewFilter", null); } adapter.setServletInstance(new SpringServlet()); adapter.setContextPath(testContextPath); adapter.setServletPath(testServletPath); return adapter; } public static void closeSelectorThread(SelectorThread selectorThread) { selectorThread.stopEndpoint(); } public static Client createJerseyClient() { ClientConfig clientConfig = new DefaultClientConfig(); clientConfig.getClasses().add(MimeMultipartProvider.class); clientConfig.getClasses().add(JacksonJsonProvider.class); return Client.create(clientConfig); } private RestTestUtils() { } }