Skip to content

Commit 4675cc4

Browse files
authored
DOC-428: Added sports activity feed streaming and polling example
Authored-by: Jonathan Hall <jon.hall@diffusiondata.com>
1 parent 992ea91 commit 4675cc4

29 files changed

Lines changed: 2748 additions & 0 deletions

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<module>sample-diffusion-adapter</module>
1515
<module>human-diffusion-adapter</module>
1616
<module>languageConverter</module>
17+
<module>sports-activity-feed-adapter</module>
1718
</modules>
1819

1920
<properties>

sports-activity-feed-adapter/README.md

Lines changed: 688 additions & 0 deletions
Large diffs are not rendered by default.
129 KB
Loading
105 KB
Loading
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
6+
<modelVersion>4.0.0</modelVersion>
7+
8+
<parent>
9+
<artifactId>gateway-examples</artifactId>
10+
<groupId>com.diffusiondata.gateway.adapter</groupId>
11+
<version>1.0.0</version>
12+
</parent>
13+
14+
<groupId>com.diffusiondata.gateway.examples</groupId>
15+
<artifactId>sports-activity-feed-adapter</artifactId>
16+
17+
<properties>
18+
<jackson-datatype-jsr310.version>2.16.1</jackson-datatype-jsr310.version>
19+
<datafaker.version>1.9.0</datafaker.version>
20+
<junit-jupiter-api.version>5.11.3</junit-jupiter-api.version>
21+
<hamcrest.version>3.0</hamcrest.version>
22+
<mockito.version>5.11.0</mockito.version>
23+
24+
<maven-assembly-plugin.version>3.7.1</maven-assembly-plugin.version>
25+
</properties>
26+
27+
<dependencies>
28+
<dependency>
29+
<groupId>com.fasterxml.jackson.datatype</groupId>
30+
<artifactId>jackson-datatype-jsr310</artifactId>
31+
<version>${jackson-datatype-jsr310.version}</version>
32+
</dependency>
33+
34+
<dependency>
35+
<groupId>net.datafaker</groupId>
36+
<artifactId>datafaker</artifactId>
37+
<version>${datafaker.version}</version>
38+
</dependency>
39+
40+
<dependency>
41+
<groupId>org.junit.jupiter</groupId>
42+
<artifactId>junit-jupiter-api</artifactId>
43+
<version>${junit-jupiter-api.version}</version>
44+
<scope>test</scope>
45+
</dependency>
46+
47+
<dependency>
48+
<groupId>org.hamcrest</groupId>
49+
<artifactId>hamcrest</artifactId>
50+
<version>${hamcrest.version}</version>
51+
<scope>test</scope>
52+
</dependency>
53+
54+
<dependency>
55+
<groupId>org.mockito</groupId>
56+
<artifactId>mockito-core</artifactId>
57+
<version>${mockito.version}</version>
58+
<scope>test</scope>
59+
</dependency>
60+
<dependency>
61+
<groupId>org.mockito</groupId>
62+
<artifactId>mockito-junit-jupiter</artifactId>
63+
<version>${mockito.version}</version>
64+
<scope>test</scope>
65+
</dependency>
66+
</dependencies>
67+
68+
<build>
69+
<plugins>
70+
<plugin>
71+
<groupId>org.apache.maven.plugins</groupId>
72+
<artifactId>maven-assembly-plugin</artifactId>
73+
<version>${maven-assembly-plugin.version}</version>
74+
<configuration>
75+
<descriptorRefs>
76+
<descriptorRef>
77+
jar-with-dependencies
78+
</descriptorRef>
79+
</descriptorRefs>
80+
<archive>
81+
<manifest>
82+
<mainClass>com.diffusiondata.gateway.example.sportsactivity.feed.Runner</mainClass>
83+
</manifest>
84+
</archive>
85+
</configuration>
86+
<executions>
87+
<execution>
88+
<id>make-assembly</id>
89+
<phase>package</phase>
90+
<goals>
91+
<goal>single</goal>
92+
</goals>
93+
</execution>
94+
</executions>
95+
</plugin>
96+
</plugins>
97+
</build>
98+
</project>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.diffusiondata.gateway.example.common.jackson;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
5+
6+
public final class ObjectMapperUtils {
7+
private ObjectMapperUtils() {
8+
// Private method to prevent creation
9+
}
10+
11+
public static ObjectMapper createAndConfigureObjectMapper() {
12+
final ObjectMapper objectMapper = new ObjectMapper();
13+
objectMapper.registerModule(new JavaTimeModule());
14+
15+
return objectMapper;
16+
}
17+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.diffusiondata.gateway.example.sportsactivity.feed;
2+
3+
import static com.diffusiondata.gateway.example.common.jackson.ObjectMapperUtils.createAndConfigureObjectMapper;
4+
5+
import com.diffusiondata.gateway.framework.DiffusionGatewayFramework;
6+
import com.diffusiondata.gateway.framework.GatewayApplication;
7+
import com.diffusiondata.pretend.example.sportsactivity.feed.client.impl.SportsActivityFeedClientImpl;
8+
9+
public final class Runner {
10+
public static void main(String[] args) {
11+
DiffusionGatewayFramework.start(createGatewayApplication());
12+
}
13+
14+
/**
15+
* package for tests.
16+
*/
17+
static GatewayApplication createGatewayApplication() {
18+
return new SportsActivityFeedGatewayApplication(
19+
SportsActivityFeedClientImpl.connectToActivityFeedServer(),
20+
createAndConfigureObjectMapper());
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package com.diffusiondata.gateway.example.sportsactivity.feed;
2+
3+
import static java.util.Objects.requireNonNull;
4+
5+
import java.util.concurrent.CompletableFuture;
6+
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
10+
import com.diffusiondata.gateway.framework.DiffusionGatewayFramework;
11+
import com.diffusiondata.gateway.framework.GatewayApplication;
12+
import com.diffusiondata.gateway.framework.PollingSourceHandler;
13+
import com.diffusiondata.gateway.framework.Publisher;
14+
import com.diffusiondata.gateway.framework.ServiceDefinition;
15+
import com.diffusiondata.gateway.framework.ServiceMode;
16+
import com.diffusiondata.gateway.framework.StateHandler;
17+
import com.diffusiondata.gateway.framework.StreamingSourceHandler;
18+
import com.diffusiondata.gateway.framework.exceptions.ApplicationConfigurationException;
19+
import com.diffusiondata.gateway.framework.exceptions.InvalidConfigurationException;
20+
import com.diffusiondata.pretend.example.sportsactivity.feed.client.SportsActivityFeedClient;
21+
import com.fasterxml.jackson.databind.ObjectMapper;
22+
23+
import net.jcip.annotations.Immutable;
24+
25+
@Immutable
26+
public final class SportsActivityFeedGatewayApplication
27+
implements GatewayApplication {
28+
29+
static final String APPLICATION_TYPE =
30+
"sports-activity-feed-application";
31+
32+
static final String SPORTS_ACTIVITY_FEED_STREAMER_SERVICE_TYPE_NAME =
33+
"SPORTS_ACTIVITY_FEED_STREAMER";
34+
35+
static final String SPORTS_ACTIVITY_FEED_POLLER_SERVICE_TYPE_NAME =
36+
"SPORTS_ACTIVITY_FEED_POLLER";
37+
38+
private static final Logger LOG =
39+
LoggerFactory.getLogger(SportsActivityFeedGatewayApplication.class);
40+
41+
private final SportsActivityFeedClient sportsActivityFeedClient;
42+
private final ObjectMapper objectMapper;
43+
44+
public SportsActivityFeedGatewayApplication(
45+
SportsActivityFeedClient sportsActivityFeedClient,
46+
ObjectMapper objectMapper) {
47+
48+
this.sportsActivityFeedClient =
49+
requireNonNull(sportsActivityFeedClient,
50+
"sportsActivityFeedClient");
51+
52+
this.objectMapper =
53+
requireNonNull(objectMapper, "objectMapper");
54+
}
55+
56+
@Override
57+
public ApplicationDetails getApplicationDetails()
58+
throws ApplicationConfigurationException {
59+
60+
return DiffusionGatewayFramework.newApplicationDetailsBuilder()
61+
.addServiceType(
62+
SPORTS_ACTIVITY_FEED_POLLER_SERVICE_TYPE_NAME,
63+
ServiceMode.POLLING_SOURCE,
64+
"Polls the sports activity feed at a regular interval",
65+
null) // For this example we won't use schema validation
66+
.addServiceType(
67+
SPORTS_ACTIVITY_FEED_STREAMER_SERVICE_TYPE_NAME,
68+
ServiceMode.STREAMING_SOURCE,
69+
"Streams the sports activities as they are available",
70+
null) // For this example we won't use schema validation
71+
.build(APPLICATION_TYPE, 1);
72+
}
73+
74+
@Override
75+
public StreamingSourceHandler addStreamingSource(
76+
ServiceDefinition serviceDefinition,
77+
Publisher publisher,
78+
StateHandler stateHandler)
79+
throws InvalidConfigurationException {
80+
81+
final String serviceType =
82+
serviceDefinition.getServiceType().getName();
83+
84+
if (SPORTS_ACTIVITY_FEED_STREAMER_SERVICE_TYPE_NAME.equals(serviceType)) {
85+
return new SportsActivityFeedStreamingSourceHandler(
86+
sportsActivityFeedClient,
87+
serviceDefinition,
88+
publisher,
89+
stateHandler,
90+
objectMapper);
91+
}
92+
93+
throw new InvalidConfigurationException(
94+
"Unknown service type: " + serviceType);
95+
}
96+
97+
@Override
98+
public PollingSourceHandler addPollingSource(
99+
ServiceDefinition serviceDefinition,
100+
Publisher publisher,
101+
StateHandler stateHandler)
102+
throws InvalidConfigurationException {
103+
104+
final String serviceType =
105+
serviceDefinition.getServiceType().getName();
106+
107+
if (SPORTS_ACTIVITY_FEED_POLLER_SERVICE_TYPE_NAME.equals(serviceType)) {
108+
return new SportsActivityFeedPollingSourceHandler(
109+
sportsActivityFeedClient,
110+
serviceDefinition,
111+
publisher,
112+
stateHandler,
113+
objectMapper);
114+
}
115+
116+
throw new InvalidConfigurationException(
117+
"Unknown service type: " + serviceType);
118+
}
119+
120+
@Override
121+
public CompletableFuture<?> stop() {
122+
LOG.info("Application stop");
123+
124+
return CompletableFuture.completedFuture(null);
125+
}
126+
}

0 commit comments

Comments
 (0)