package io.robe.admin;
import com.google.inject.Module;
import io.dropwizard.Application;
import io.dropwizard.hibernate.UnitOfWork;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import io.robe.admin.cli.InitializeCommand;
import io.robe.admin.guice.module.HibernateModule;
import io.robe.admin.hibernate.dao.*;
import io.robe.admin.quartz.JobPersister;
import io.robe.admin.recaptcha.ReCaptchaValidation;
import io.robe.assets.AdvancedAssetBundle;
import io.robe.auth.token.TokenAuthBundle;
import io.robe.auth.token.TokenAuthenticator;
import io.robe.auth.token.jersey.TokenFactory;
import io.robe.common.exception.ExceptionMapperBinder;
import io.robe.common.exception.RobeExceptionMapper;
import io.robe.common.exception.RobeRuntimeException;
import io.robe.common.service.search.SearchFactoryProvider;
import io.robe.guice.GuiceBundle;
import io.robe.hibernate.RobeHibernateBundle;
import io.robe.mail.MailBundle;
import io.robe.quartz.QuartzBundle;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
/**
* Default io.robe.admin class of Robe.
* If you extend this class on your applications io.robe.admin class and call super methods at
* overridden methods you will still benefit of robe souse.
*/
public class RobeApplication<T extends RobeConfiguration> extends Application<T> {
private static final Logger LOGGER = LoggerFactory.getLogger(RobeApplication.class);
private static String configurationPath;
private T config;
public static void main(String[] args) throws Exception {
RobeApplication application = new RobeApplication();
application.run(args);
}
@Override
public void run(String... args) throws Exception {
if (args.length < 2) {
LOGGER.error("Give a config yml path.");
} else {
configurationPath = args[1];
}
super.run(args);
}
/**
* Adds
* Hibernate bundle for PROVIDER connection
* Asset bundle for io.robe.admin screens and
* Class scanners for
* <ul>
* <li>Entities</li>
* <li>HealthChecks</li>
* <li>Providers</li>
* <li>InjectableProviders</li>
* <li>Resources</li>
* <li>Tasks</li>
* <li>Managed objects</li>
* </ul>
*
* @param bootstrap
*/
@Override
public void initialize(Bootstrap<T> bootstrap) {
T config = loadConfiguration(bootstrap);
RobeHibernateBundle<T> hibernateBundle = RobeHibernateBundle.createInstance(
config.getHibernate().getScanPackages(),
config.getHibernate().getEntities());
List<Module> modules = new LinkedList<>();
modules.add(new HibernateModule(hibernateBundle));
bootstrap.addBundle(new GuiceBundle<T>(modules, bootstrap.getApplication().getConfigurationClass()));
bootstrap.addBundle(hibernateBundle);
bootstrap.addBundle(new TokenAuthBundle<T>());
bootstrap.addCommand(new InitializeCommand(this, hibernateBundle));
bootstrap.addBundle(new QuartzBundle<T>());
bootstrap.addBundle(new MailBundle<T>());
bootstrap.addBundle(new AdvancedAssetBundle<T>());
}
public T getConfiguration() {
return config;
}
protected T loadConfiguration(Bootstrap bootstrap) {
if (config == null) {
try {
config = (T) bootstrap.getConfigurationFactoryFactory().create(
bootstrap.getApplication().getConfigurationClass(),
bootstrap.getValidatorFactory().getValidator(),
bootstrap.getObjectMapper(), "")
.build(new File(configurationPath));
} catch (Exception e) {
throw new RobeRuntimeException("Can't load configuration :" + configurationPath, e);
}
}
return config;
}
/**
* {@inheritDoc}
* In addition adds exception mapper.
*
* @param configuration
* @param environment
* @throws Exception
*/
@UnitOfWork
@Override
public void run(T configuration, Environment environment) throws Exception {
TokenFactory.authenticator = new TokenAuthenticator(
GuiceBundle.getInjector().getInstance(UserDao.class),
GuiceBundle.getInjector().getInstance(ServiceDao.class),
GuiceBundle.getInjector().getInstance(RoleDao.class),
GuiceBundle.getInjector().getInstance(PermissionDao.class),
GuiceBundle.getInjector().getInstance(RoleGroupDao.class));
TokenFactory.tokenKey = configuration.getAuth().getTokenKey();
environment.jersey().register(RobeExceptionMapper.class);
environment.jersey().register(new ExceptionMapperBinder(true));
environment.jersey().register(new SearchFactoryProvider.Binder());
environment.jersey().register(MultiPartFeature.class);
if (configuration.getRecaptcha() != null) {
new ReCaptchaValidation(configuration.getRecaptcha());
}
JobPersister jobPersister = new JobPersister(QuartzBundle.JOBS);
}
}