package com.juick.ws.configuration; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.juick.ws.WebsocketComponent; import com.juick.ws.XMPPConnection; import com.mitchellbosecke.pebble.PebbleEngine; import com.mitchellbosecke.pebble.loader.Loader; import com.mitchellbosecke.pebble.loader.ServletLoader; import com.mitchellbosecke.pebble.spring4.PebbleViewResolver; import com.mitchellbosecke.pebble.spring4.extension.SpringExtension; import org.apache.commons.dbcp2.BasicDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.ServletWebSocketHandlerRegistry; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; import javax.inject.Inject; import javax.servlet.ServletContext; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by vitalyster on 28.06.2016. */ @Configuration @EnableWebSocket @ComponentScan(basePackages = {"com.juick"}) @PropertySource(value = "classpath:juick.conf", ignoreResourceNotFound = true) public class WebsocketConfiguration extends WebMvcConfigurationSupport implements WebSocketConfigurer { @Inject Environment env; @Inject ExecutorService service; @Bean WebsocketComponent wsHandler() { return new WebsocketComponent(); } @Bean JdbcTemplate jdbc() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(env.getProperty("datasource_driver", "com.mysql.jdbc.Driver")); dataSource.setUrl(env.getProperty("datasource_url")); return new JdbcTemplate(dataSource); } @Inject private ServletContext servletContext; @Bean public Loader templateLoader(){ return new ServletLoader(servletContext); } @Bean public SpringExtension springExtension() { return new SpringExtension(); } @Bean public PebbleEngine pebbleEngine() { return new PebbleEngine.Builder() .loader(this.templateLoader()) .extension(springExtension()) .build(); } @Bean public ViewResolver viewResolver() { PebbleViewResolver viewResolver = new PebbleViewResolver(); viewResolver.setPrefix("/WEB-INF/templates/"); viewResolver.setSuffix(".html"); viewResolver.setPebbleEngine(pebbleEngine()); return viewResolver; } @Bean public XMPPConnection ws() { return new XMPPConnection(env, service); } @Bean public ExecutorService service() { return Executors.newCachedThreadPool(); } @Override public RequestMappingHandlerMapping requestMappingHandlerMapping() { RequestMappingHandlerMapping mapping = super.requestMappingHandlerMapping(); mapping.setUseSuffixPatternMatch(false); return mapping; } @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { ((ServletWebSocketHandlerRegistry)registry).setOrder(2); registry.addHandler(wsHandler(), "/**").setAllowedOrigins("*"); } @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.setOrder(0); registry.addResourceHandler("/scripts.js").addResourceLocations("/"); registry.addResourceHandler("/style.css").addResourceLocations("/"); } @Override protected void configureMessageConverters(List> converters) { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() .serializationInclusion(JsonInclude.Include.NON_DEFAULT) .serializationInclusion(JsonInclude.Include.NON_NULL) .serializationInclusion(JsonInclude.Include.NON_ABSENT) .serializationInclusion(JsonInclude.Include.NON_EMPTY); MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build()); converter.getObjectMapper().registerModule(new Jdk8Module()); converters.add(converter); super.configureMessageConverters(converters); } }