package org.koshinuke.test;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.koshinuke.conf.Configuration;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.container.filter.GZIPContentEncodingFilter;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.spi.container.servlet.ServletContainer;
import com.sun.jersey.test.framework.AppDescriptor;
import com.sun.jersey.test.framework.spi.container.TestContainer;
import com.sun.jersey.test.framework.spi.container.TestContainerException;
import com.sun.jersey.test.framework.spi.container.TestContainerFactory;
/**
* @author taichi
*/
public class JettyTestContainerFactory implements TestContainerFactory {
@Override
@SuppressWarnings("unchecked")
public Class<SimpleAppDescriptor> supports() {
return SimpleAppDescriptor.class;
}
@Override
public TestContainer create(URI baseUri, AppDescriptor ad)
throws IllegalArgumentException {
return new JettyTestContainer(baseUri,
SimpleAppDescriptor.class.cast(ad));
}
static class JettyTestContainer implements TestContainer {
Server server;
URI baseUri;
public JettyTestContainer(URI baseUri, SimpleAppDescriptor ad)
throws IllegalArgumentException {
this.baseUri = baseUri;
try {
ServletHolder holder = new ServletHolder(ServletContainer.class);
holder.setInitParameter(
ServletContainer.APPLICATION_CONFIG_CLASS, ad
.getApplicationClass().getName());
holder.setInitParameter(
ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS,
GZIPContentEncodingFilter.class.getName());
holder.setInitParameter(
ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS,
GZIPContentEncodingFilter.class.getName());
ServletContextHandler sch = new ServletContextHandler();
sch.setAttribute(Configuration.NAME, new File(
"src/test/koshinuke-test.properties").toURI().toURL());
sch.setResourceBase("src/webapp");
sch.addServlet(holder, "/*");
this.server = new Server(this.baseUri.getPort());
this.server.setHandler(sch);
} catch (MalformedURLException e) {
throw new IllegalArgumentException(e);
}
}
@Override
public Client getClient() {
return null;
}
@Override
public URI getBaseUri() {
return this.baseUri;
}
@Override
public void start() {
try {
this.server.start();
} catch (Exception e) {
throw new TestContainerException(e);
}
}
@Override
public void stop() {
try {
if (this.server.isStarted()) {
this.server.stop();
}
} catch (Exception e) {
throw new TestContainerException(e);
}
}
}
}