diff options
-rw-r--r-- | juick-notifications/build.gradle | 37 | ||||
-rw-r--r-- | juick-notifications/src/main/java/com/juick/notifications/CloudNotifications.java (renamed from juick-ws/src/main/java/com/juick/ws/components/PushComponent.java) | 15 | ||||
-rw-r--r-- | juick-notifications/src/main/java/com/juick/notifications/api/Status.java | 19 | ||||
-rw-r--r-- | juick-notifications/src/main/java/com/juick/notifications/configuration/NotificationsConfiguration.java | 114 | ||||
-rw-r--r-- | juick-notifications/src/main/java/com/juick/notifications/configuration/NotificationsInitializer.java | 33 | ||||
-rw-r--r-- | juick-notifications/src/main/java/com/juick/notifications/controllers/StatusController.java | 27 | ||||
-rw-r--r-- | juick-notifications/src/main/webapp/WEB-INF/web.xml | 4 | ||||
-rw-r--r-- | juick-ws/src/main/java/com/juick/ws/configuration/WebsocketConfiguration.java | 5 | ||||
-rw-r--r-- | settings.gradle | 2 |
9 files changed, 241 insertions, 15 deletions
diff --git a/juick-notifications/build.gradle b/juick-notifications/build.gradle new file mode 100644 index 00000000..77258103 --- /dev/null +++ b/juick-notifications/build.gradle @@ -0,0 +1,37 @@ +apply plugin: 'java' +apply plugin: 'war' +apply plugin: 'org.akhikhl.gretty' +apply plugin: 'com.github.ben-manes.versions' + +repositories { + mavenCentral() +} + +dependencies { + compile project(':juick-core') + compile 'org.slf4j:slf4j-jdk14:1.7.21' + compile 'com.ganyo:gcm-server:1.1.0' + compile 'com.notnoop.apns:apns:1.0.0.Beta6' + def springFrameworkVersion = '4.3.3.RELEASE' + compile "org.springframework:spring-jdbc:${springFrameworkVersion}" + compile "org.springframework:spring-webmvc:${springFrameworkVersion}" + compile "org.springframework:spring-websocket:${springFrameworkVersion}" + def jacksonVersion = '2.8.4' + compile "com.fasterxml.jackson.core:jackson-core:${jacksonVersion}" + compile "com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}" + compile "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:${jacksonVersion}" + compile 'javax.inject:javax.inject:1' + compile 'org.apache.httpcomponents:httpclient:4.5.2' + compile 'org.apache.commons:commons-dbcp2:2.1.1' + compile 'com.mitchellbosecke:pebble-spring4:2.2.3' + providedRuntime 'mysql:mysql-connector-java:5.1.39' +} + +compileJava.options.encoding = 'UTF-8' + +gretty { + httpPort = 8080 + contextPath = '' + servletContainer = 'tomcat8' +} + diff --git a/juick-ws/src/main/java/com/juick/ws/components/PushComponent.java b/juick-notifications/src/main/java/com/juick/notifications/CloudNotifications.java index 54dd21de..1ad1802f 100644 --- a/juick-ws/src/main/java/com/juick/ws/components/PushComponent.java +++ b/juick-notifications/src/main/java/com/juick/notifications/CloudNotifications.java @@ -15,12 +15,9 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -package com.juick.ws.components; +package com.juick.notifications; -import com.google.android.gcm.server.Message; -import com.google.android.gcm.server.MulticastResult; -import com.google.android.gcm.server.Result; -import com.google.android.gcm.server.Sender; +import com.google.android.gcm.server.*; import com.juick.json.MessageSerializer; import com.juick.server.PushQueries; import com.juick.server.SubscriptionsQueries; @@ -67,9 +64,9 @@ import java.util.stream.Collectors; * @author Ugnich Anton */ @Component -public class PushComponent implements DisposableBean, Stream.StreamListener, MessageListener { +public class CloudNotifications implements DisposableBean, Stream.StreamListener, MessageListener { - private static Logger logger = Logger.getLogger(PushComponent.class.getName()); + private static Logger logger = Logger.getLogger(CloudNotifications.class.getName()); String wns_application_sip; String wns_client_secret; @@ -81,12 +78,12 @@ public class PushComponent implements DisposableBean, Stream.StreamListener, Mes ExecutorService service; @Inject - public PushComponent(Environment env, ExecutorService service) { + public CloudNotifications(Environment env, ExecutorService service) { this.service = service; logger.info("component initialized"); wns_application_sip = env.getProperty("wns_application_sip", ""); wns_client_secret = env.getProperty("wns_client_secret", ""); - GCMSender = new Sender(env.getProperty("gcm_key", "")); + GCMSender = new Sender(env.getProperty("gcm_key", ""), Endpoint.GCM); setupXmppComponent(new JID("", env.getProperty("push_jid"), ""), env.getProperty("xmpp_host", "localhost"), NumberUtils.toInt(env.getProperty("xmpp_port", ""), 5347), env.getProperty("push_xmpp_password", "")); diff --git a/juick-notifications/src/main/java/com/juick/notifications/api/Status.java b/juick-notifications/src/main/java/com/juick/notifications/api/Status.java new file mode 100644 index 00000000..dcdc0ccd --- /dev/null +++ b/juick-notifications/src/main/java/com/juick/notifications/api/Status.java @@ -0,0 +1,19 @@ +package com.juick.notifications.api; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Created by vitalyster on 25.07.2016. + */ +public class Status { + private String value; + + public Status(String value) { + this.value = value; + } + + @JsonProperty("status") + public String getValue() { + return value; + } +} diff --git a/juick-notifications/src/main/java/com/juick/notifications/configuration/NotificationsConfiguration.java b/juick-notifications/src/main/java/com/juick/notifications/configuration/NotificationsConfiguration.java new file mode 100644 index 00000000..e1267de0 --- /dev/null +++ b/juick-notifications/src/main/java/com/juick/notifications/configuration/NotificationsConfiguration.java @@ -0,0 +1,114 @@ +package com.juick.notifications.configuration; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.juick.notifications.CloudNotifications; +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 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 +@ComponentScan(basePackages = {"com.juick"}) +@PropertySource("classpath:juick.conf") +public class NotificationsConfiguration extends WebMvcConfigurationSupport { + @Inject + Environment env; + @Inject + ExecutorService service; + + @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 CloudNotifications push() { + return new CloudNotifications(env, service); + } + @Bean + public ExecutorService service() { + return Executors.newCachedThreadPool(); + } + + @Override + public RequestMappingHandlerMapping requestMappingHandlerMapping() { + RequestMappingHandlerMapping mapping = super.requestMappingHandlerMapping(); + mapping.setUseSuffixPatternMatch(false); + return mapping; + } + @Override + protected void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.setOrder(0); + registry.addResourceHandler("/scripts.js").addResourceLocations("/"); + registry.addResourceHandler("/style.css").addResourceLocations("/"); + } + + @Override + protected void configureMessageConverters(List<HttpMessageConverter<?>> 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); + } +} diff --git a/juick-notifications/src/main/java/com/juick/notifications/configuration/NotificationsInitializer.java b/juick-notifications/src/main/java/com/juick/notifications/configuration/NotificationsInitializer.java new file mode 100644 index 00000000..cd547138 --- /dev/null +++ b/juick-notifications/src/main/java/com/juick/notifications/configuration/NotificationsInitializer.java @@ -0,0 +1,33 @@ +package com.juick.notifications.configuration; +import org.springframework.web.filter.CharacterEncodingFilter; +import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; + +import javax.servlet.Filter; + +/** + * Created by vt on 09/02/16. + */ +public class NotificationsInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { + @Override + protected Class<?>[] getRootConfigClasses() { + return new Class[] {NotificationsConfiguration.class}; + } + + @Override + protected Class<?>[] getServletConfigClasses() { + return null; + } + + @Override + protected String[] getServletMappings() { + return new String[] { + "/" + }; + } + @Override + protected Filter[] getServletFilters() { + CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); + characterEncodingFilter.setEncoding("UTF-8"); + return new Filter[] { characterEncodingFilter}; + } +} diff --git a/juick-notifications/src/main/java/com/juick/notifications/controllers/StatusController.java b/juick-notifications/src/main/java/com/juick/notifications/controllers/StatusController.java new file mode 100644 index 00000000..41f44a35 --- /dev/null +++ b/juick-notifications/src/main/java/com/juick/notifications/controllers/StatusController.java @@ -0,0 +1,27 @@ +package com.juick.notifications.controllers; + +import com.juick.notifications.CloudNotifications; +import com.juick.notifications.api.Status; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.inject.Inject; + +/** + * Created by vitalyster on 24.10.2016. + */ +@Controller +@ResponseBody +public class StatusController { + @Inject + CloudNotifications push; + + @RequestMapping(method = RequestMethod.GET, value = "/", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public Status status() { + String status = push != null ? "OK" : "Fail"; + return new Status(status); + } +} diff --git a/juick-notifications/src/main/webapp/WEB-INF/web.xml b/juick-notifications/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..7e1c30d0 --- /dev/null +++ b/juick-notifications/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> + +</web-app> diff --git a/juick-ws/src/main/java/com/juick/ws/configuration/WebsocketConfiguration.java b/juick-ws/src/main/java/com/juick/ws/configuration/WebsocketConfiguration.java index a05457fa..783865ed 100644 --- a/juick-ws/src/main/java/com/juick/ws/configuration/WebsocketConfiguration.java +++ b/juick-ws/src/main/java/com/juick/ws/configuration/WebsocketConfiguration.java @@ -5,7 +5,6 @@ import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.juick.ws.WebsocketComponent; import com.juick.ws.XMPPConnection; import com.juick.ws.components.CrosspostComponent; -import com.juick.ws.components.PushComponent; import com.juick.ws.components.XMPPComponent; import com.mitchellbosecke.pebble.PebbleEngine; import com.mitchellbosecke.pebble.loader.Loader; @@ -103,10 +102,6 @@ public class WebsocketConfiguration extends WebMvcConfigurationSupport implement return new CrosspostComponent(env, service); } @Bean - public PushComponent push() { - return new PushComponent(env, service); - } - @Bean public ExecutorService service() { return Executors.newCachedThreadPool(); } diff --git a/settings.gradle b/settings.gradle index aa3962b0..e85c92a1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':deps:com.juick.xmpp', ':juick-core', ':juick-api', ':juick-www', ':juick-rss', ':juick-ws', ':juick-demo' +include ':deps:com.juick.xmpp', ':juick-core', ':juick-api', ':juick-www', ':juick-rss', ':juick-ws', ':juick-demo', ':juick-notifications' |