package org.jvalue.ods.main;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.hubspot.jackson.jaxrs.PropertyFilteringMessageBodyWriter;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.servlet.ServletContainer;
import org.hibernate.validator.HibernateValidator;
import org.hibernate.validator.HibernateValidatorConfiguration;
import org.hibernate.validator.cfg.ConstraintMapping;
import org.hibernate.validator.cfg.GenericConstraintDef;
import org.jvalue.commons.auth.AuthBinder;
import org.jvalue.commons.auth.BasicAuthUserDescription;
import org.jvalue.commons.auth.UserManager;
import org.jvalue.commons.auth.rest.UnauthorizedExceptionMapper;
import org.jvalue.commons.couchdb.rest.DbExceptionMapper;
import org.jvalue.commons.rest.JsonExceptionMapper;
import org.jvalue.commons.rest.NotFoundExceptionMapper;
import org.jvalue.ods.admin.monitoring.DbHealthCheck;
import org.jvalue.ods.admin.monitoring.MonitoringModule;
import org.jvalue.ods.admin.rest.AdminFilterChainApi;
import org.jvalue.ods.api.processors.ProcessorReferenceChainDescription;
import org.jvalue.ods.auth.AuthModule;
import org.jvalue.ods.data.DataModule;
import org.jvalue.ods.data.DataSourceManager;
import org.jvalue.ods.db.DbModule;
import org.jvalue.ods.notifications.NotificationsModule;
import org.jvalue.ods.pegelalarm.CepsClientHealthCheck;
import org.jvalue.ods.pegelalarm.DataHealthCheck;
import org.jvalue.ods.pegelalarm.DataSourceHealthCheck;
import org.jvalue.ods.pegelalarm.FilterChainHealthCheck;
import org.jvalue.ods.pegelalarm.PegelOnlineHealthCheck;
import org.jvalue.ods.processor.ProcessorModule;
import org.jvalue.ods.processor.reference.ValidChainReference;
import org.jvalue.ods.rest.DataApi;
import org.jvalue.ods.rest.DataSourceApi;
import org.jvalue.ods.rest.DataViewApi;
import org.jvalue.ods.rest.NotificationApi;
import org.jvalue.ods.rest.PluginApi;
import org.jvalue.ods.rest.ProcessorChainApi;
import org.jvalue.ods.rest.ProcessorSpecificationApi;
import org.jvalue.ods.rest.UserApi;
import org.jvalue.ods.rest.VersionApi;
import org.jvalue.ods.utils.GuiceConstraintValidatorFactory;
import java.util.List;
import javax.validation.Validation;
import javax.ws.rs.core.Context;
import io.dropwizard.Application;
import io.dropwizard.jersey.DropwizardResourceConfig;
import io.dropwizard.jersey.setup.JerseyContainerHolder;
import io.dropwizard.setup.Environment;
public final class OdsApplication extends Application<OdsConfig> {
public static void main(String[] args) throws Exception {
new OdsApplication().run(args);
}
@Override
public String getName() {
return "Open Data Service";
}
@Override
@Context
public void run(OdsConfig configuration, Environment environment) {
Injector injector = Guice.createInjector(
new MonitoringModule(environment.metrics()),
new ConfigModule(configuration),
new ProcessorModule(),
new DbModule(configuration.getCouchDb()),
new NotificationsModule(),
new DataModule(),
new AuthModule(configuration.getAuth()));
// start data grabbing
environment.lifecycle().manage(injector.getInstance(DataSourceManager.class));
environment.jersey().getResourceConfig().register(MultiPartFeature.class);
environment.jersey().getResourceConfig().register(injector.getInstance(AuthBinder.class));
environment.jersey().register(injector.getInstance(DataSourceApi.class));
environment.jersey().register(injector.getInstance(DataApi.class));
environment.jersey().register(injector.getInstance(ProcessorChainApi.class));
environment.jersey().register(injector.getInstance(DataViewApi.class));
environment.jersey().register(injector.getInstance(NotificationApi.class));
environment.jersey().register(injector.getInstance(PluginApi.class));
environment.jersey().register(injector.getInstance(ProcessorSpecificationApi.class));
environment.jersey().register(injector.getInstance(VersionApi.class));
environment.jersey().register(injector.getInstance(UserApi.class));
environment.jersey().register(PropertyFilteringMessageBodyWriter.class);
environment.jersey().register(new DbExceptionMapper());
environment.jersey().register(new JsonExceptionMapper());
environment.jersey().register(new UnauthorizedExceptionMapper());
environment.jersey().register(new NotFoundExceptionMapper());
// setup users
setupDefaultUsers(injector.getInstance(UserManager.class), configuration.getAuth().getUsers());
// setup health checks
environment.healthChecks().register(DbHealthCheck.class.getSimpleName(), injector.getInstance(DbHealthCheck.class));
environment.healthChecks().register(PegelOnlineHealthCheck.class.getSimpleName(), injector.getInstance(PegelOnlineHealthCheck.class));
environment.healthChecks().register(DataSourceHealthCheck.class.getSimpleName(), injector.getInstance(DataSourceHealthCheck.class));
environment.healthChecks().register(FilterChainHealthCheck.class.getSimpleName(), injector.getInstance(FilterChainHealthCheck.class));
environment.healthChecks().register(DataHealthCheck.class.getSimpleName(), injector.getInstance(DataHealthCheck.class));
environment.healthChecks().register(CepsClientHealthCheck.class.getSimpleName(), injector.getInstance(CepsClientHealthCheck.class));
// configure administration
DropwizardResourceConfig jerseyConfig = new DropwizardResourceConfig(environment.metrics());
JerseyContainerHolder jerseyContainerHolder = new JerseyContainerHolder(new ServletContainer(jerseyConfig));
jerseyConfig.register(injector.getInstance(AdminFilterChainApi.class));
environment.admin().addServlet("admin resources", jerseyContainerHolder.getContainer()).addMapping("/admin/*");
// setup validation for external classes
HibernateValidatorConfiguration validatorContext = Validation.byProvider(HibernateValidator.class).configure();
ConstraintMapping mapping = validatorContext.createConstraintMapping();
mapping.type(ProcessorReferenceChainDescription.class).constraint(new GenericConstraintDef<>(ValidChainReference.class));
// setup Guice DI for hibernate validator
environment.setValidator(validatorContext.addMapping(mapping)
.constraintValidatorFactory(new GuiceConstraintValidatorFactory(injector))
.buildValidatorFactory()
.getValidator());
}
private void setupDefaultUsers(UserManager userManager, List<BasicAuthUserDescription> userList) {
for (BasicAuthUserDescription user : userList) {
if (!userManager.contains(user.getEmail())) userManager.add(user);
}
}
}