package guiceberry2_junit3.tutorial_1_server.prod; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.Provides; import com.google.inject.servlet.GuiceFilter; import com.google.inject.servlet.ServletModule; import org.mortbay.jetty.Server; import org.mortbay.jetty.servlet.Context; import org.mortbay.jetty.servlet.DefaultServlet; import java.util.Random; public class MyPetStoreServer { private final Server server; private final int portNumber; public MyPetStoreServer(int portNumber) { this.portNumber = portNumber; server = new Server(portNumber); Context root = new Context(server, "/", Context.SESSIONS); root.addFilter(GuiceFilter.class, "/*", 0); root.addServlet(DefaultServlet.class, "/"); } public Injector start() { try { Injector result = Guice.createInjector(getPetStoreModule()); server.start(); return result; } catch (Exception e) { throw new RuntimeException(e); } } public int getPortNumber() { return portNumber; } protected Module getPetStoreModule() { return new PetStoreModule(); } private static final class MyServletModule extends ServletModule { @Override protected void configureServlets() { serve("/*").with(WelcomePageServlet.class); } } public static class PetStoreModule extends AbstractModule { @Provides protected PetOfTheMonth getPetOfTheMonth() { return somePetOfTheMonth(); } private final Random rand = new Random(); /** Simulates a call to a non-deterministic service -- maybe an external * server, maybe a DB call to a volatile entry, etc. */ protected PetOfTheMonth somePetOfTheMonth() { PetOfTheMonth[] allPetsOfTheMonth = PetOfTheMonth.values(); return allPetsOfTheMonth[(rand.nextInt(allPetsOfTheMonth.length))]; } @Override protected void configure() { install(new MyServletModule()); } } public static void main(String[] args) throws Exception { MyPetStoreServer petStoreServer = new MyPetStoreServer(8080); petStoreServer.start(); Thread.sleep(20000); petStoreServer.server.stop(); } }