Skip to content

Commit 660d89a

Browse files
sanepalMichael Wunderlich
authored andcommitted
SQL database integration
1 parent 85f4749 commit 660d89a

12 files changed

+131
-46
lines changed

public/app/xray-controller.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,19 @@ function XRayController($scope, $http, $location, SessionCollection, UserCollect
1111
var shouldRunRdsDemo = false;
1212
$scope.gameHistory = [];
1313

14+
$scope.isRdsConfigured = false;
15+
var isRdsConfigured = function() {
16+
GameHistoryModel.get().then(
17+
function(success) {
18+
$scope.isRdsConfigured = true;
19+
},
20+
function(error) {
21+
$scope.isRdsConfigured = false;
22+
}
23+
);
24+
};
25+
isRdsConfigured();
26+
1427
var runDdbDemo = function() {
1528
ddbRunning = true;
1629
var user1, user2, session, game;

public/xray.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<div class="jumbotron">
22
<div class="container">
33
<h1 class="display-3">AWS X-Ray Demo</h1>
4-
<p class="lead">Descriptive text</p>
4+
<p class="lead"></p>
55
</div>
66
</div>
77
<div class="container">
@@ -18,7 +18,7 @@ <h1 class="display-3">AWS X-Ray Demo</h1>
1818
</div>
1919
<div class="col-md-6">
2020
<div class="row">
21-
<div class="col-md-10 offset-md-1">
21+
<div class="col-md-10 offset-md-1" ng-show="isRdsConfigured">
2222
<button type="button" class="btn btn-outline-primary btn-lg btn-block" ng-click="toggleRdsDemo()">{{ getRdsDemoPrompt() }}</button>
2323
<p class="text-xs-center"><a href="https://console.aws.amazon.com/xray/home#/traces?filter=http.url%20CONTAINS%20%22history%22">View Traces</a></p>
2424
<hr>
@@ -40,6 +40,9 @@ <h1 class="display-3">AWS X-Ray Demo</h1>
4040
</tbody>
4141
</table>
4242
</div>
43+
<div class="col-md-10 offset-md-1" ng-hide="isRdsConfigured">
44+
<p>Use AWS Elastic Beanstalk to attach a database instance to this environment for the RDS demo.</p>
45+
</div>
4346
</div>
4447
</div>
4548
</div>

src/main/java/scorekeep/Application.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package scorekeep;
22

33
import org.springframework.boot.SpringApplication;
4-
import org.springframework.boot.autoconfigure.SpringBootApplication;
4+
import org.springframework.boot.builder.SpringApplicationBuilder;
5+
import org.springframework.context.annotation.ComponentScan;
6+
import org.springframework.context.annotation.Configuration;
57
import org.springframework.core.env.AbstractEnvironment;
68

7-
@SpringBootApplication
9+
@Configuration
10+
@ComponentScan
811
public class Application {
912

1013
enum Profile {
11-
MYSQL("mysql"),
14+
NODB("nodb"),
1215
PGSQL("pgsql");
1316

1417
private final String name;
@@ -28,11 +31,23 @@ public static void main(String[] args) {
2831
SpringApplication.run(Application.class, args);
2932
}
3033

34+
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
35+
return application.sources(Application.class);
36+
}
37+
3138
public static String getProfile() {
32-
if (null != System.getenv("RDS_HOSTNAME") && null != System.getenv("RDS_USERNAME") && null != System.getenv("RDS_PASSWORD") && null != System.getenv("RDS_PORT")) {
39+
if (isRdsEnabled()) {
3340
return Profile.PGSQL.toString();
3441
} else {
35-
return Profile.MYSQL.toString();
42+
return Profile.NODB.toString();
3643
}
3744
}
45+
46+
public static boolean isRdsEnabled() {
47+
// Only enabled if the relevant environment variables are set
48+
return (null != System.getenv("RDS_HOSTNAME")
49+
&& null != System.getenv("RDS_USERNAME")
50+
&& null != System.getenv("RDS_PASSWORD")
51+
&& null != System.getenv("RDS_PORT"));
52+
}
3853
}

src/main/java/scorekeep/GameHistoryController.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,24 @@
1313
@RequestMapping(value="/api/history")
1414
public class GameHistoryController {
1515

16-
@Autowired
16+
@Autowired(required = false)
1717
private GameHistoryModel model;
1818
private UserFactory userFactory = new UserFactory();
1919

2020
@RequestMapping(method = RequestMethod.GET)
21-
public List<GameHistory> get() {
21+
public List<GameHistory> get() throws RdsNotConfiguredException {
22+
if (! Application.isRdsEnabled()) {
23+
throw new RdsNotConfiguredException();
24+
}
2225
return model.get();
2326
}
2427

2528
@RequestMapping(method = RequestMethod.POST)
26-
public GameHistory create() throws IOException {
29+
public GameHistory create() throws IOException, RdsNotConfiguredException {
30+
if (! Application.isRdsEnabled()) {
31+
throw new RdsNotConfiguredException();
32+
}
33+
2734
String winner = userFactory.randomName();
2835
String loser = userFactory.randomName();
2936

src/main/java/scorekeep/GameHistoryModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
public class GameHistoryModel {
1111

12-
@Autowired
12+
@Autowired(required = false)
1313
private GameHistoryRepository repository;
1414

1515
public List<GameHistory> get() {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package scorekeep;
2+
3+
import org.springframework.http.HttpStatus;
4+
import org.springframework.web.bind.annotation.ResponseStatus;
5+
6+
@ResponseStatus(value= HttpStatus.SERVICE_UNAVAILABLE, reason="RDS database is not attached. Attach an RDS database.")
7+
public class RdsNotConfiguredException extends Exception {
8+
9+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package scorekeep;
2+
3+
import com.amazonaws.xray.AWSXRay;
4+
import com.amazonaws.xray.AWSXRayRecorderBuilder;
5+
import com.amazonaws.xray.javax.servlet.AWSXRayServletFilter;
6+
import com.amazonaws.xray.plugins.EC2Plugin;
7+
import com.amazonaws.xray.strategy.sampling.DefaultSamplingStrategy;
8+
import org.apache.commons.logging.Log;
9+
import org.apache.commons.logging.LogFactory;
10+
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
11+
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
12+
import org.springframework.boot.context.properties.ConfigurationProperties;
13+
import org.springframework.context.annotation.Bean;
14+
import org.springframework.context.annotation.Configuration;
15+
import org.springframework.context.annotation.Profile;
16+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
17+
18+
import javax.servlet.Filter;
19+
import javax.sql.DataSource;
20+
import java.net.URL;
21+
22+
@Configuration
23+
@EnableAutoConfiguration
24+
@EnableJpaRepositories("scorekeep")
25+
@Profile("pgsql")
26+
public class RdsWebConfig {
27+
private static final Log logger = LogFactory.getLog(WebConfig.class);
28+
29+
@Bean
30+
public Filter TracingFilter() {
31+
return new AWSXRayServletFilter();
32+
}
33+
34+
@Bean
35+
public Filter SimpleCORSFilter() {
36+
return new SimpleCORSFilter();
37+
}
38+
39+
@Bean
40+
@ConfigurationProperties(prefix = "spring.datasource")
41+
public DataSource dataSource() {
42+
logger.info("Initializing PostgreSQL datasource");
43+
return DataSourceBuilder.create()
44+
.driverClassName("org.postgresql.Driver")
45+
.url("jdbc:postgresql://" + System.getenv("RDS_HOSTNAME") + ":" + System.getenv("RDS_PORT") + "/ebdb")
46+
.username(System.getenv("RDS_USERNAME"))
47+
.password(System.getenv("RDS_PASSWORD"))
48+
.build();
49+
}
50+
51+
@Bean
52+
public GameHistoryModel gameHistoryModel() {
53+
return new GameHistoryModel();
54+
}
55+
56+
static {
57+
AWSXRayRecorderBuilder builder = AWSXRayRecorderBuilder.standard().withPlugin(new EC2Plugin());
58+
59+
URL ruleFile = WebConfig.class.getResource("/sampling-rules.json");
60+
builder.withSamplingStrategy(new DefaultSamplingStrategy(ruleFile));
61+
62+
AWSXRay.setGlobalRecorder(builder.build());
63+
}
64+
}

src/main/java/scorekeep/WebConfig.java

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,20 @@
88
import org.apache.commons.logging.Log;
99
import org.apache.commons.logging.LogFactory;
1010
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
11-
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
12-
import org.springframework.boot.context.properties.ConfigurationProperties;
11+
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
12+
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
13+
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
1314
import org.springframework.context.annotation.Bean;
1415
import org.springframework.context.annotation.Configuration;
15-
import org.springframework.context.annotation.Primary;
16-
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
16+
import org.springframework.context.annotation.Profile;
1717

1818
import javax.servlet.Filter;
19-
import javax.sql.DataSource;
2019
import java.net.URL;
2120

2221

2322
@Configuration
24-
@EnableAutoConfiguration
25-
@EnableJpaRepositories("scorekeep")
23+
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
24+
@Profile("nodb")
2625
public class WebConfig {
2726
private static final Log logger = LogFactory.getLog(WebConfig.class);
2827

@@ -36,29 +35,6 @@ public Filter SimpleCORSFilter() {
3635
return new SimpleCORSFilter();
3736
}
3837

39-
@Bean
40-
@Primary
41-
@ConfigurationProperties(prefix = "spring.datasource")
42-
public DataSource dataSource() {
43-
if (Application.Profile.PGSQL.toString().equals(Application.getProfile())) {
44-
logger.info("Initializing PostgreSQL datasource");
45-
return DataSourceBuilder.create()
46-
.driverClassName("org.postgresql.Driver")
47-
.url("jdbc:postgresql://" + System.getenv("RDS_HOSTNAME") + ":" + System.getenv("RDS_PORT") + "/ebdb")
48-
.username(System.getenv("RDS_USERNAME"))
49-
.password(System.getenv("RDS_PASSWORD"))
50-
.build();
51-
} else {
52-
logger.info("Initializing MySQL datasource");
53-
return DataSourceBuilder.create().url("jdbc:h2:mem:ebdb").build();
54-
}
55-
}
56-
57-
@Bean
58-
public GameHistoryModel gameHistoryModel() {
59-
return new GameHistoryModel();
60-
}
61-
6238
static {
6339
AWSXRayRecorderBuilder builder = AWSXRayRecorderBuilder.standard().withPlugin(new EC2Plugin());
6440

src/main/resources/application-mysql.properties

Lines changed: 0 additions & 2 deletions
This file was deleted.

src/main/resources/application-nodb.properties

Whitespace-only changes.

0 commit comments

Comments
 (0)