package net.olemartin; import com.google.common.cache.CacheBuilderSpec; import io.dropwizard.Application; import io.dropwizard.auth.AuthDynamicFeature; import io.dropwizard.auth.AuthValueFactoryProvider; import io.dropwizard.auth.basic.BasicCredentialAuthFilter; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; import net.olemartin.domain.User; import net.olemartin.dropwizard.MonradConfiguration; import net.olemartin.push.ChangeNotification; import net.olemartin.service.user.ChessAuthenticator; import net.olemartin.service.user.UserService; import net.olemartin.spring.MonradProfile; import net.olemartin.spring.Production; import net.olemartin.tools.GsonJSONProvider; import org.eclipse.jetty.servlets.CrossOriginFilter; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.core.env.AbstractEnvironment; import javax.annotation.Resource; import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; import javax.servlet.ServletRegistration; import java.util.EnumSet; import java.util.Map; public class Main extends Application<MonradConfiguration> { public static void main(String[] args) throws Exception { //new Main().run(args); System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "production"); new Main().run(new String[]{"server", "monrad.yaml"}); } @Override public void initialize(Bootstrap<MonradConfiguration> bootstrap) { CacheBuilderSpec.disableCaching(); } @Override public void run(MonradConfiguration config, Environment environment) throws Exception { System.setProperty("spring.profiles.active", config.getProfile()); if (config.getProfile().equals(MonradProfile.PRODUCTION)) { Production.setNeo4jPath(config.getNeo4jPath()); } AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(net.olemartin.spring.Bootstrap.class); Map<String, Object> beans = context.getBeansWithAnnotation(Resource.class); context.getBean(UserService.class).createUser("olemartin", "okki1234", "Ole-Martin"); context.getBean(UserService.class).createUser("selbekk", "scratcharoo", "Kristoffer"); for (Object o : beans.values()) { environment.jersey().register(o); } environment.jersey().register(GsonJSONProvider.class); environment.jersey().setUrlPattern("/rest/*"); environment.jersey().register(new AuthDynamicFeature( new BasicCredentialAuthFilter.Builder<User>() .setAuthenticator(context.getBean(ChessAuthenticator.class)) .setRealm("SUPER SECRET STUFF") .buildAuthFilter())); environment.jersey().register(new AuthValueFactoryProvider.Binder<>(User.class)); ServletRegistration.Dynamic websocket = environment.servlets().addServlet("websocket", context.getBean(ChangeNotification.class)); websocket.setAsyncSupported(true); websocket.addMapping("/push/*"); // CORS support final FilterRegistration.Dynamic cors = environment.servlets().addFilter("CORS", CrossOriginFilter.class); // Configure CORS parameters cors.setInitParameter("allowedOrigins", "*"); // TODO: This probably needs a more strict setting at some point cors.setInitParameter("allowedHeaders", "Authorization,X-Requested-With,Content-Type,Accept,Origin"); cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD"); // Add URL mapping cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); } }