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 @@