package net.maritimecloud.portal.config;
import java.io.IOException;
import java.util.Properties;
import javax.annotation.Resource;
import javax.servlet.DispatcherType;
import net.maritimecloud.portal.*;
import net.maritimecloud.portal.infrastructure.shiro.ShiroAuthenticationUtil;
import net.maritimecloud.identityregistry.domain.EncryptionService;
import net.maritimecloud.portal.security.AuthenticationUtil;
import net.maritimecloud.portal.infrastructure.mail.MailAdapter;
import net.maritimecloud.portal.infrastructure.mail.MailService;
import net.maritimecloud.portal.infrastructure.mail.SmtpMailAdapter;
import net.maritimecloud.portal.infrastructure.mail.VelocityMessageComposer;
import net.maritimecloud.portal.infrastructure.service.SHA512EncryptionService;
import net.maritimecloud.portal.resource.LogService;
import net.maritimecloud.common.resource.SimpleCORSFilter;
import net.maritimecloud.identityregistry.domain.IdentityService;
import net.maritimecloud.serviceregistry.domain.service.AliasService;
import net.maritimecloud.serviceregistry.infrastructure.service.JpaAliasService;
import org.apache.shiro.web.env.EnvironmentLoaderListener;
import org.apache.shiro.web.servlet.ShiroFilter;
import org.apache.velocity.app.VelocityEngine;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.servlet.ServletProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.boot.context.embedded.ServletListenerRegistrationBean;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.Environment;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.ui.velocity.VelocityEngineFactoryBean;
@Configuration
@Import(value = {AxonConfig.class, JpaConfig.class})
public class ApplicationConfig {
private static final Logger LOG = LoggerFactory.getLogger(ApplicationConfig.class);
@Value(value = "${baseUrl:localhost:8080}")
private String baseUrl;
@Value(value = "${spaUrl:${baseUrl:localhost:8080}/app/index.html}")
private String spaUrl;
@Resource
private Environment env;
@Resource
private ApplicationContextSetup applicationContextSetup;
@Resource
private JavaMailSender mailSender;
@Bean
public ApplicationContextSetup applicationContextSetup() {
// this will trigger that the application context is propagated to all registries
return new ApplicationContextSetup();
}
@Bean
public ServletRegistrationBean jerseyServlet() {
ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), "/rest/*");
registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyConfig.class.getName());
return registration;
}
@Bean
public EncryptionService encryptionService() {
return new SHA512EncryptionService();
}
@Bean
public FilterRegistrationBean shiroFilterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
ShiroFilter shiroFilter = new ShiroFilter();
registrationBean.setFilter(shiroFilter);
registrationBean.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.values());
registrationBean.setOrder(0);
return registrationBean;
}
@Bean
public ServletListenerRegistrationBean shiroServletListenerRegistrationBean() {
ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean();
EnvironmentLoaderListener environmentLoaderListener = new EnvironmentLoaderListener();
registrationBean.setListener(environmentLoaderListener);
registrationBean.setOrder(0);
return registrationBean;
}
@Bean
public LogService logService() {
// TODO: introduce interface and implementations
return new LogService();
}
/**
* @return AuthenticationUtil that bridges the current request to a user in Shiro
*/
@Bean
public AuthenticationUtil authenticationUtil() {
return new ShiroAuthenticationUtil();
}
/**
* Make RESTful web service include CORS access control headers in its responses.
* <p>
* This will allow our client to be hosted elsewhere, e.g. from another port.
* <p>
* (See http://spring.io/guides/gs/rest-service-cors/ )
* <p>
* @return a SimpleCORSFilter
*/
@Bean
public SimpleCORSFilter simpleCORSFilter() {
return new SimpleCORSFilter();
}
@Bean
public VelocityEngine velocityEngine() throws IOException {
Properties props = new Properties();
props.put("resource.loader", "class");
props.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
VelocityEngineFactoryBean velocityEngineFactoryBean = new VelocityEngineFactoryBean();
velocityEngineFactoryBean.setVelocityProperties(props);
VelocityEngine velocityEngine = velocityEngineFactoryBean.createVelocityEngine();
return velocityEngine;
}
@Bean
public MailAdapter mailAdapter() throws IOException {
LOG.info("Using Mail sender with host '" + env.getProperty("spring.mail.host") + "' and user '" + env.getProperty("spring.mail.user") + "'");
LOG.info("************* Links to maritime cloud use this base URL: " + baseUrl);
LOG.info("************* Links to maritime cloud use this spa URL: " + spaUrl);
return new SmtpMailAdapter(mailSender);
}
@Bean
public MailService mailService() throws IOException {
return new MailService(new VelocityMessageComposer(velocityEngine(), spaUrl), mailAdapter());
}
@Bean
public AliasService aliasService() throws IOException {
return new JpaAliasService();
}
@Bean
public IdentityService identityService() throws IOException {
return new IdentityService();
}
}