diff --git a/README b/README index 4c0af05..408cd7c 100644 --- a/README +++ b/README @@ -1,5 +1,5 @@ ======================================================================================================================== -README - Spring in Practice Recipe 1.1 +README - Spring in Practice Recipe 1.8 Copyright (c) 2013 Manning Publications Co. diff --git a/pom.xml b/pom.xml index 377dbeb..843f3ff 100644 --- a/pom.xml +++ b/pom.xml @@ -1,22 +1,22 @@ - - - - + + + + 4.0.0 @@ -33,6 +33,11 @@ Code: https://github.com/springinpractice + + org.springframework + spring-context + 3.1.1.RELEASE + commons-dbcp commons-dbcp diff --git a/src/main/java/com/springinpractice/ch01/ConsoleApp.java b/src/main/java/com/springinpractice/ch01/ConsoleApp.java new file mode 100644 index 0000000..0fcd3ae --- /dev/null +++ b/src/main/java/com/springinpractice/ch01/ConsoleApp.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2013 Manning Publications Co. + * + * Book: http://manning.com/wheeler/ + * Blog: http://springinpractice.com/ + * Code: https://github.com/springinpractice + */ +package com.springinpractice.ch01; + +import java.util.List; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import com.springinpractice.ch01.model.Account; +import com.springinpractice.ch01.service.AccountService; + +public class ConsoleApp { + public static void main(String[] args) throws Exception { + ApplicationContext appCtx = + new ClassPathXmlApplicationContext("applicationContext.xml"); + AccountService accountService = + (AccountService)appCtx.getBean("accountService"); + List delinquentAccounts = accountService + .findDeliquentAccounts(); + + for (Account a : delinquentAccounts) { + System.out.println(a.getAccountNo()); + } + } +} diff --git a/src/main/java/com/springinpractice/ch01/dao/AccountDao.java b/src/main/java/com/springinpractice/ch01/dao/AccountDao.java index 1bfc0a0..d301090 100644 --- a/src/main/java/com/springinpractice/ch01/dao/AccountDao.java +++ b/src/main/java/com/springinpractice/ch01/dao/AccountDao.java @@ -7,5 +7,11 @@ */ package com.springinpractice.ch01.dao; +import java.util.List; + +import com.springinpractice.ch01.model.Account; + public interface AccountDao { + + List findAll() throws Exception; } diff --git a/src/main/java/com/springinpractice/ch01/dao/csv/CsvAccountDao.java b/src/main/java/com/springinpractice/ch01/dao/csv/CsvAccountDao.java new file mode 100644 index 0000000..0d6a2f3 --- /dev/null +++ b/src/main/java/com/springinpractice/ch01/dao/csv/CsvAccountDao.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2013 Manning Publications Co. + * + * Book: http://manning.com/wheeler/ + * Blog: http://springinpractice.com/ + * Code: https://github.com/springinpractice + */ +package com.springinpractice.ch01.dao.csv; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.springframework.core.io.Resource; +import com.springinpractice.ch01.dao.AccountDao; +import com.springinpractice.ch01.model.Account; + +public class CsvAccountDao implements AccountDao { + + private Resource csvResource; + + public void setCsvResource(Resource csvFile) { + this.csvResource = csvFile; + } + + public List findAll() throws Exception { + List results = new ArrayList(); + + DateFormat fmt = new SimpleDateFormat("MMddyyyy"); + BufferedReader br = new BufferedReader( + new FileReader(csvResource.getFile())); + String line; + while ((line = br.readLine()) != null) { + String[] fields = line.split(","); + + String accountNo = fields[0]; + BigDecimal balance = new BigDecimal(fields[1]); + Date lastPaidOn = fmt.parse(fields[2]); + Account account = + new Account(accountNo, balance, lastPaidOn); + results.add(account); + } + br.close(); + return results; + } +} diff --git a/src/main/java/com/springinpractice/ch01/dao/jdbc/JdbcAccountDao.java b/src/main/java/com/springinpractice/ch01/dao/jdbc/JdbcAccountDao.java index e647131..1cbd579 100644 --- a/src/main/java/com/springinpractice/ch01/dao/jdbc/JdbcAccountDao.java +++ b/src/main/java/com/springinpractice/ch01/dao/jdbc/JdbcAccountDao.java @@ -7,20 +7,30 @@ */ package com.springinpractice.ch01.dao.jdbc; -import org.apache.commons.dbcp.BasicDataSource; +import java.util.List; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import com.springinpractice.ch01.dao.AccountDao; +import com.springinpractice.ch01.model.Account; +@Component public class JdbcAccountDao implements AccountDao { - private BasicDataSource dataSource; - public JdbcAccountDao() { - dataSource = new BasicDataSource(); - dataSource.setDriverClassName("com.mysql.jdbc.Driver"); - dataSource.setUrl("jdbc:mysql://localhost:3306/springbook" + - "?autoReconnect=true"); - dataSource.setUsername("root"); - dataSource.setPassword(""); + @Autowired + private DataSource dataSource; + + public JdbcAccountDao() {} + + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + } + + public List findAll() throws Exception { + throw new UnsupportedOperationException("This method has not been implemented"); } } diff --git a/src/main/java/com/springinpractice/ch01/model/Account.java b/src/main/java/com/springinpractice/ch01/model/Account.java new file mode 100644 index 0000000..c926537 --- /dev/null +++ b/src/main/java/com/springinpractice/ch01/model/Account.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2013 Manning Publications Co. + * + * Book: http://manning.com/wheeler/ + * Blog: http://springinpractice.com/ + * Code: https://github.com/springinpractice + */ +package com.springinpractice.ch01.model; + +import java.math.BigDecimal; +import java.util.Date; + +public class Account { + + private String accountNo; + private BigDecimal balance; + private Date lastPaidOn; + + public Account(String accountNo, BigDecimal balance, Date lastPaidOn) { + this.accountNo = accountNo; + this.balance = balance; + this.lastPaidOn = lastPaidOn; + } + + public String getAccountNo() { + return accountNo; + } + + public BigDecimal getBalance() { + return balance; + } + + public Date getLastPaidOn() { + return lastPaidOn; + } +} diff --git a/src/main/java/com/springinpractice/ch01/service/AccountService.java b/src/main/java/com/springinpractice/ch01/service/AccountService.java new file mode 100644 index 0000000..2f2cf3d --- /dev/null +++ b/src/main/java/com/springinpractice/ch01/service/AccountService.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2013 Manning Publications Co. + * + * Book: http://manning.com/wheeler/ + * Blog: http://springinpractice.com/ + * Code: https://github.com/springinpractice + */ +package com.springinpractice.ch01.service; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.springinpractice.ch01.dao.AccountDao; +import com.springinpractice.ch01.model.Account; + +@Component +public class AccountService { + + @Autowired + private AccountDao accountDao; + + public AccountService() {} + + public void setAccountDao(AccountDao accountDao) { + this.accountDao = accountDao; + } + + public List findDeliquentAccounts() throws Exception { + List delinquentAccounts = new ArrayList(); + List accounts = accountDao.findAll(); + + Date thirtyDaysAgo = daysAgo(30); + for (Account account : accounts) { + boolean owesMoney = account.getBalance() + .compareTo(BigDecimal.ZERO) > 0; + boolean thirtyDaysLate = account.getLastPaidOn() + .compareTo(thirtyDaysAgo) <= 0; + + if (owesMoney && thirtyDaysLate) { + delinquentAccounts.add(account); + } + } + return delinquentAccounts; + } + + private static Date daysAgo(int days) { + GregorianCalendar gc = new GregorianCalendar(); + gc.add(Calendar.DATE, -days); + return gc.getTime(); + } + +} diff --git a/src/main/resources/accounts.csv b/src/main/resources/accounts.csv new file mode 100644 index 0000000..25096ad --- /dev/null +++ b/src/main/resources/accounts.csv @@ -0,0 +1,3 @@ +100,0,09012008 +200,100,08012008 +300,-100,09012008 \ No newline at end of file diff --git a/src/main/resources/applicationContext.xml b/src/main/resources/applicationContext.xml new file mode 100644 index 0000000..c85fa48 --- /dev/null +++ b/src/main/resources/applicationContext.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/dataSource.properties b/src/main/resources/dataSource.properties new file mode 100644 index 0000000..cbbcb04 --- /dev/null +++ b/src/main/resources/dataSource.properties @@ -0,0 +1,4 @@ +driverClassName=com.mysql.jdbc.Driver +url=:mysql://localhost:3306/springbook?autoReconnect=true +username=someusername +password=somepassword \ No newline at end of file diff --git a/src/main/resources/springbook.properties b/src/main/resources/springbook.properties new file mode 100644 index 0000000..5ad3fe8 --- /dev/null +++ b/src/main/resources/springbook.properties @@ -0,0 +1,8 @@ +# Change springbook.properties to reflect your environment +dataSource.driverClassName=com.mysql.jdbc.Driver +dataSource.url=jdbc:mysql://localhost:3306/springbook?autoReconnect=true +dataSource.username=root +dataSource.password= +mailSender.host=mail.kattare.com +recaptcha.publicKey=get_one_from_recaptcha_website +recaptcha.privateKey=get_one_from_recaptcha_website \ No newline at end of file