diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml
new file mode 100644
index 0000000..5dfbdec
--- /dev/null
+++ b/.idea/codeStyleSettings.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 164b970..d5d79e0 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,19 +1,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/.idea/modules/flashy.iml b/.idea/modules/flashy.iml
index 2f6b1cf..91b9bed 100644
--- a/.idea/modules/flashy.iml
+++ b/.idea/modules/flashy.iml
@@ -5,6 +5,7 @@
+
diff --git a/.idea/modules/flashy_main.iml b/.idea/modules/flashy_main.iml
index 3d7e5d1..0a07db2 100644
--- a/.idea/modules/flashy_main.iml
+++ b/.idea/modules/flashy_main.iml
@@ -1,7 +1,7 @@
-
-
+
+
@@ -14,6 +14,7 @@
+
@@ -29,6 +30,7 @@
+
@@ -68,7 +70,6 @@
-
diff --git a/.idea/modules/flashy_test.iml b/.idea/modules/flashy_test.iml
index 3c5b73a..14ed706 100644
--- a/.idea/modules/flashy_test.iml
+++ b/.idea/modules/flashy_test.iml
@@ -1,7 +1,7 @@
-
-
+
+
@@ -15,6 +15,7 @@
+
@@ -31,6 +32,7 @@
+
@@ -71,7 +73,6 @@
-
diff --git a/build.gradle b/build.gradle
index c89d069..9d48940 100644
--- a/build.gradle
+++ b/build.gradle
@@ -27,5 +27,8 @@ dependencies {
compile 'org.springframework.boot:spring-boot-starter-thymeleaf'
compile 'com.h2database:h2'
compile 'org.eclipse.mylyn.github:org.eclipse.egit.github.core:2.1.5'
+ // https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-dbcp
+ compile 'org.apache.tomcat:tomcat-dbcp:9.0.2'
+
testCompile group: 'junit', name: 'junit', version: '4.11'
}
diff --git a/src/main/java/com/teamtreehouse/flashy/bootstrap/DatabaseLoader.java b/src/main/java/com/teamtreehouse/flashy/bootstrap/DatabaseLoader.java
deleted file mode 100644
index 239bb00..0000000
--- a/src/main/java/com/teamtreehouse/flashy/bootstrap/DatabaseLoader.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.teamtreehouse.flashy.bootstrap;
-
-import com.teamtreehouse.flashy.domain.FlashCard;
-import com.teamtreehouse.flashy.repositories.FlashCardRepository;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Component
-public class DatabaseLoader implements ApplicationRunner {
- @Autowired
- private FlashCardRepository flashCardRepository;
-
- public void run(ApplicationArguments args) throws Exception {
- List cards = new ArrayList<>();
- cards.add(new FlashCard("JDK", "Java Development Kit"));
- cards.add(new FlashCard("YAGNI", "You Ain't Gonna Need It"));
- cards.add(new FlashCard("SDK", "Software Development Kit"));
- cards.add(new FlashCard("Java SE", "Java Standard Edition"));
- cards.add(new FlashCard("Java EE", "Java Enterprise Edition"));
- cards.add(new FlashCard("JRE", "Java Runtime Environment"));
- cards.add(new FlashCard("JCL", "Java Class Library"));
- cards.add(new FlashCard("JVM", "Java Virtual Machine"));
- flashCardRepository.save(cards);
- }
-
-}
diff --git a/src/main/java/com/teamtreehouse/flashy/config/DataConfig.java b/src/main/java/com/teamtreehouse/flashy/config/DataConfig.java
new file mode 100644
index 0000000..8bab082
--- /dev/null
+++ b/src/main/java/com/teamtreehouse/flashy/config/DataConfig.java
@@ -0,0 +1,56 @@
+package com.teamtreehouse.flashy.config;
+
+import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+
+import javax.sql.DataSource;
+import java.util.Properties;
+
+@Configuration
+@EnableJpaRepositories(basePackages = "com.teamtreehouse.flashy.repositories")
+@PropertySource("application.properties")
+public class DataConfig {
+ @Autowired
+ private Environment env;
+
+ @Bean
+ public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
+ LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
+
+ HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
+
+ factory.setDataSource(dataSource());
+ factory.setJpaVendorAdapter(vendorAdapter);
+ factory.setPackagesToScan(env.getProperty("flashy.entity.package"));
+ factory.setJpaProperties(getHibernateProperties());
+
+ return factory;
+ }
+
+ @Bean
+ public DataSource dataSource() {
+ BasicDataSource ds = new BasicDataSource();
+ ds.setDriverClassName(env.getProperty("flashy.db.driver"));
+ ds.setUrl(env.getProperty("flashy.db.url"));
+ ds.setUsername(env.getProperty("flashy.db.username"));
+ ds.setPassword(env.getProperty("flashy.db.password"));
+ return ds;
+ }
+
+ private Properties getHibernateProperties() {
+ Properties properties = new Properties();
+ properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
+ properties.put("hibernate.implicit_naming_strategy", env.getProperty("hibernate.implicit_naming_strategy"));
+ properties.put("hibernate.format_sql", env.getProperty("hibernate.format_sql"));
+ properties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
+ properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
+ return properties;
+ }
+}
diff --git a/src/main/java/com/teamtreehouse/flashy/controllers/IndexController.java b/src/main/java/com/teamtreehouse/flashy/controllers/IndexController.java
index f127754..79d476d 100644
--- a/src/main/java/com/teamtreehouse/flashy/controllers/IndexController.java
+++ b/src/main/java/com/teamtreehouse/flashy/controllers/IndexController.java
@@ -12,6 +12,7 @@
@Controller
public class IndexController {
+ public static final int AMOUNT_TO_SHOW = 3;
private FlashCardService flashCardService;
@Autowired
@@ -22,7 +23,7 @@ public void setFlashCardService(FlashCardService flashCardService) {
@RequestMapping("/")
public String index(Model model) {
StringBuilder ctaBuilder = new StringBuilder();
- List cards = flashCardService.getRandomFlashCards(5);
+ List cards = flashCardService.getRandomFlashCards(AMOUNT_TO_SHOW);
ctaBuilder.append("Refresh your memory about ");
for (FlashCard card : cards) {
ctaBuilder.append(card.getTerm());
@@ -30,10 +31,12 @@ public String index(Model model) {
ctaBuilder.append(", ");
}
}
- ctaBuilder.append(" and ");
Long totalCount = flashCardService.getCurrentCount();
- ctaBuilder.append(totalCount);
- ctaBuilder.append(" more");
+ if (totalCount > AMOUNT_TO_SHOW) {
+ ctaBuilder.append(" and ");
+ ctaBuilder.append(totalCount - AMOUNT_TO_SHOW);
+ ctaBuilder.append(" more");
+ }
model.addAttribute("cta", ctaBuilder.toString());
model.addAttribute("flashCardCount", totalCount);
return "index";
diff --git a/src/main/java/com/teamtreehouse/flashy/services/FlashCardServiceImpl.java b/src/main/java/com/teamtreehouse/flashy/services/FlashCardServiceImpl.java
index 5b660e9..88204f2 100644
--- a/src/main/java/com/teamtreehouse/flashy/services/FlashCardServiceImpl.java
+++ b/src/main/java/com/teamtreehouse/flashy/services/FlashCardServiceImpl.java
@@ -6,11 +6,14 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Random;
+import java.util.Set;
import static java.util.stream.Collectors.toList;
@@ -52,22 +55,22 @@ public FlashCard getNextUnseenFlashCard(Collection seenIds) {
@Override
public FlashCard getNextFlashCardBasedOnViews(Map idToViewCounts) {
FlashCard card = getNextUnseenFlashCard(idToViewCounts.keySet());
- if (card != null) {
- return card;
+ if (card == null) {
+ card = getLeastViewedFlashCard(idToViewCounts);
}
+ return card;
+ }
+
+ public FlashCard getLeastViewedFlashCard(Map idToViewCounts) {
Long leastViewedId = null;
- for (Map.Entry entry : idToViewCounts.entrySet()) {
- if (leastViewedId == null) {
- leastViewedId = entry.getKey();
- continue;
- }
- Long lowestScore = idToViewCounts.get(leastViewedId);
- if (entry.getValue() >= lowestScore) {
- break;
- }
- leastViewedId = entry.getKey();
- }
- return flashCardRepository.findOne(leastViewedId);
+ List> entries = new ArrayList<>(idToViewCounts.entrySet());
+ Collections.shuffle(entries);
+
+ return entries.stream()
+ .min(Comparator.comparing(Map.Entry::getValue))
+ .map(entry -> flashCardRepository.findOne(entry.getKey()))
+ .orElseThrow(IllegalArgumentException::new);
+
}
@Override
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
new file mode 100644
index 0000000..f076f7e
--- /dev/null
+++ b/src/main/resources/application.properties
@@ -0,0 +1,13 @@
+# Package where our entities (models) are located
+flashy.entity.package = com.teamtreehouse.flashy.domain
+
+# Details for our datasource
+flashy.db.driver = org.h2.Driver
+flashy.db.url = jdbc:h2:mem:flashy
+
+# Hibernate properties
+hibernate.dialect = org.hibernate.dialect.H2Dialect
+hibernate.implicit_naming_strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
+hibernate.format_sql = true
+hibernate.show_sql = true
+hibernate.hbm2ddl.auto = create-drop
\ No newline at end of file
diff --git a/src/main/resources/import.sql b/src/main/resources/import.sql
new file mode 100644
index 0000000..69a2d67
--- /dev/null
+++ b/src/main/resources/import.sql
@@ -0,0 +1,9 @@
+-- Insert flash cards
+insert into flashcard (term, definition) values ('JDK', 'Java Development Kit');
+insert into flashcard (term, definition) values ('YAGNI', 'You Ain''t Gonna Need It');
+insert into flashcard (term, definition) values ('Java SE', 'Java Standard Edition');
+insert into flashcard (term, definition) values ('Java EE', 'Java Enterprise Edition');
+insert into flashcard (term, definition) values ('JRE', 'Java Runtime Environment');
+insert into flashcard (term, definition) values ('JCL', 'Java Class Library');
+insert into flashcard (term, definition) values ('JVM', 'Java Virtual Machine');
+insert into flashcard (term, definition) values ('SDK', 'Software Development Kit');
\ No newline at end of file
diff --git a/src/main/resources/templates/flashcard_show.html b/src/main/resources/templates/flashcard_show.html
index 9a7c4f4..f8d0c92 100644
--- a/src/main/resources/templates/flashcard_show.html
+++ b/src/main/resources/templates/flashcard_show.html
@@ -11,7 +11,7 @@