diff --git a/liuxin/knowledge-point/pom.xml b/liuxin/knowledge-point/pom.xml
new file mode 100644
index 0000000000..3dc438c7d9
--- /dev/null
+++ b/liuxin/knowledge-point/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+
+ com.coderising
+ knowledge-point
+ 0.0.1-SNAPSHOT
+ jar
+
+ knowledge-point
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+ aliyunmaven
+ http://maven.aliyun.com/nexus/content/groups/public/
+
+
+
diff --git a/liuxin/knowledge-point/src/main/java/cas/CASSequence.java b/liuxin/knowledge-point/src/main/java/cas/CASSequence.java
new file mode 100644
index 0000000000..dcff77d9bf
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/cas/CASSequence.java
@@ -0,0 +1,18 @@
+package cas;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class CASSequence{
+
+ private AtomicInteger count = new AtomicInteger(0);
+
+ public int next(){
+ while(true){
+ int current = count.get();
+ int next = current +1;
+ if(count.compareAndSet(current, next)){
+ return next;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java b/liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java
new file mode 100644
index 0000000000..d7be44c69a
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java
@@ -0,0 +1,34 @@
+package cas;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+public class NoBlockingStack {
+ static class Node {
+ final E item;
+ Node next;
+ public Node(E item) { this.item = item; }
+ }
+
+ AtomicReference> head = new AtomicReference>();
+
+ public void push(E item) {
+ Node newHead = new Node(item);
+ Node oldHead;
+ do {
+ oldHead = head.get();
+ newHead.next = oldHead;
+ } while (!head.compareAndSet(oldHead, newHead));
+ }
+ public E pop() {
+ Node oldHead;
+ Node newHead;
+ do {
+ oldHead = head.get();
+ if (oldHead == null)
+ return null;
+ newHead = oldHead.next;
+ } while (!head.compareAndSet(oldHead,newHead));
+ return oldHead.item;
+ }
+
+}
diff --git a/liuxin/knowledge-point/src/main/java/cas/Sequence.java b/liuxin/knowledge-point/src/main/java/cas/Sequence.java
new file mode 100644
index 0000000000..688224e251
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/cas/Sequence.java
@@ -0,0 +1,11 @@
+package cas;
+
+public class Sequence{
+
+ private int value;
+
+ public int next(){
+ return value ++;
+ }
+
+}
diff --git a/liuxin/knowledge-point/src/main/java/threadlocal/Context.java b/liuxin/knowledge-point/src/main/java/threadlocal/Context.java
new file mode 100644
index 0000000000..d84584397b
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadlocal/Context.java
@@ -0,0 +1,20 @@
+package threadlocal;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Context {
+
+ private static final ThreadLocal txThreadLocal
+ = new ThreadLocal();
+
+ public static void setTransactionID(String txID) {
+ txThreadLocal.set(txID);
+
+ }
+
+ public static String getTransactionId() {
+ return txThreadLocal.get();
+ }
+
+}
+
diff --git a/liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java b/liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java
new file mode 100644
index 0000000000..8a5283fcab
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java
@@ -0,0 +1,22 @@
+package threadlocal;
+
+public class TransactionManager {
+ private static final ThreadLocal context = new ThreadLocal();
+
+ public static void startTransaction() {
+ // logic to start a transaction
+ // ...
+ String txID = null;
+ context.set(txID);
+ }
+
+ public static String getTransactionId() {
+ return context.get();
+ }
+
+ public static void endTransaction() {
+ // logic to end a transaction
+ // …
+ context.remove();
+ }
+}
diff --git a/liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java b/liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java
new file mode 100644
index 0000000000..faca2d2c70
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java
@@ -0,0 +1,35 @@
+package threadpool;
+import java.util.LinkedList;
+import java.util.List;
+
+public class BlockingQueue {
+
+ private List queue = new LinkedList();
+ private int limit = 10;
+
+ public BlockingQueue(int limit) {
+ this.limit = limit;
+ }
+
+ public synchronized void enqueue(Object item) throws InterruptedException {
+ while (this.queue.size() == this.limit) {
+ wait();
+ }
+ if (this.queue.size() == 0) {
+ notifyAll();
+ }
+ this.queue.add(item);
+ }
+
+ public synchronized Object dequeue() throws InterruptedException {
+ while (this.queue.size() == 0) {
+ wait();
+ }
+ if (this.queue.size() == this.limit) {
+ notifyAll();
+ }
+
+ return this.queue.remove(0);
+ }
+
+}
diff --git a/liuxin/knowledge-point/src/main/java/threadpool/Task.java b/liuxin/knowledge-point/src/main/java/threadpool/Task.java
new file mode 100644
index 0000000000..07413d9798
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadpool/Task.java
@@ -0,0 +1,5 @@
+package threadpool;
+
+public interface Task {
+ public void execute();
+}
diff --git a/liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java b/liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java
new file mode 100644
index 0000000000..f508f76eb5
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java
@@ -0,0 +1,37 @@
+package threadpool;
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class ThreadPool {
+
+ private BlockingQueue taskQueue = null;
+ private List threads = new ArrayList();
+ private boolean isStopped = false;
+
+ public ThreadPool(int numOfThreads, int maxNumOfTasks){
+ taskQueue = new BlockingQueue(maxNumOfTasks);
+
+ for(int i=0; i
+ 4.0.0
+
+ com.coderising
+ ood-assignment
+ 0.0.1-SNAPSHOT
+ jar
+
+ ood-assignment
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+ aliyunmaven
+ http://maven.aliyun.com/nexus/content/groups/public/
+
+
+
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..9a4cbb0f0c
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,28 @@
+/**
+ * 版权 (c) 2017 palmshe.com
+ * 保留所有权利。
+ */
+package com.coderising.ood.ocp;
+
+import com.coderising.ood.ocp.formatter.LogFormatter;
+import com.coderising.ood.ocp.handler.LogHandler;
+
+/**
+ * @Description:
+ * @author palmshe
+ * @date 2017年6月19日 下午9:10:02
+ */
+public class Logger {
+
+ private LogHandler logHandler;
+ private LogFormatter logFormatter;
+
+ public Logger(LogHandler handler, LogFormatter formatter){
+ this.logHandler= handler;
+ this.logFormatter= formatter;
+ }
+
+ public void log(String msg){
+ this.logHandler.handleLog(this.logFormatter.formatMsg(msg));
+ }
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Main.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Main.java
new file mode 100644
index 0000000000..9a072602b0
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Main.java
@@ -0,0 +1,29 @@
+/**
+ * 版权 (c) 2017 palmshe.com
+ * 保留所有权利。
+ */
+package com.coderising.ood.ocp;
+
+import com.coderising.ood.ocp.formatter.DateUtil;
+import com.coderising.ood.ocp.formatter.LogFormatter;
+import com.coderising.ood.ocp.handler.LogHandler;
+import com.coderising.ood.ocp.handler.MailUtil;
+import com.coderising.ood.ocp.handler.SMSUtil;
+
+/**
+ * @Description:
+ * @author palmshe
+ * @date 2017年6月19日 下午9:36:38
+ */
+public class Main {
+
+ public static void main(String[] args) {
+ LogHandler sms= new SMSUtil();
+ LogHandler mail= new MailUtil();
+ LogFormatter date= new DateUtil();
+ Logger log= new Logger(sms, date);
+ log.log("hello world");
+ log= new Logger(mail, date);
+ log.log("hello coder");
+ }
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/DateUtil.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/DateUtil.java
new file mode 100644
index 0000000000..7b45fd15dd
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/DateUtil.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.ocp.formatter;
+
+import java.util.Date;
+
+public class DateUtil implements LogFormatter{
+
+ private String getCurrentDateAsString() {
+
+ return "current date: "+ new Date();
+ }
+
+ /* (non-Javadoc)
+ * @see com.coderising.ood.ocp.LogFormatter#formatMsg(java.lang.String)
+ */
+ @Override
+ public String formatMsg(String msg) {
+ return getCurrentDateAsString()+ ", "+ msg;
+ }
+
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/LogFormatter.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/LogFormatter.java
new file mode 100644
index 0000000000..0be87702f2
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/LogFormatter.java
@@ -0,0 +1,15 @@
+/**
+ * 版权 (c) 2017 palmshe.com
+ * 保留所有权利。
+ */
+package com.coderising.ood.ocp.formatter;
+
+/**
+ * @Description:
+ * @author palmshe
+ * @date 2017年6月19日 下午9:07:00
+ */
+public interface LogFormatter {
+
+ String formatMsg(String msg);
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/LogHandler.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/LogHandler.java
new file mode 100644
index 0000000000..e86cebba24
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/LogHandler.java
@@ -0,0 +1,17 @@
+/**
+ * 版权 (c) 2017 palmshe.com
+ * 保留所有权利。
+ */
+package com.coderising.ood.ocp.handler;
+
+import java.io.Serializable;
+
+/**
+ * @Description:
+ * @author palmshe
+ * @date 2017年6月19日 下午9:08:04
+ */
+public interface LogHandler extends Serializable{
+
+ void handleLog(String msg);
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/MailUtil.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/MailUtil.java
new file mode 100644
index 0000000000..e9fb2d90da
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/MailUtil.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp.handler;
+
+public class MailUtil implements LogHandler{
+
+ public void handleLog(String logMsg) {
+ System.out.println("MailUtil handle, msg= "+ logMsg);
+ }
+
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/PrintUtil.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/PrintUtil.java
new file mode 100644
index 0000000000..8f2ab2b697
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/PrintUtil.java
@@ -0,0 +1,21 @@
+/**
+ * 版权 (c) 2017 palmshe.com
+ * 保留所有权利。
+ */
+package com.coderising.ood.ocp.handler;
+
+/**
+ * @Description:
+ * @author palmshe
+ * @date 2017年6月19日 下午9:22:49
+ */
+public class PrintUtil implements LogHandler{
+
+ /* (non-Javadoc)
+ * @see com.coderising.ood.ocp.LogHandler#send(java.lang.String)
+ */
+ @Override
+ public void handleLog(String msg) {
+ System.out.println("PrintUtil handle, msg= "+ msg);
+ }
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/SMSUtil.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/SMSUtil.java
new file mode 100644
index 0000000000..4bd916587d
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/SMSUtil.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp.handler;
+
+public class SMSUtil implements LogHandler{
+
+ public void handleLog(String logMsg) {
+ System.out.println("SMSUtil handle, msg= "+ logMsg);
+ }
+
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..ccffce577d
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+ static Map configurations = new HashMap();
+ static{
+ configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
+ }
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ * @param key
+ * @return
+ */
+ public static String getProperty(String key) {
+
+ return configurations.get(key);
+ }
+
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp;
+
+public class ConfigurationKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ * @param sql
+ * @return
+ */
+ public static List query(String sql){
+
+ List userList = new ArrayList();
+ for (int i = 1; i <= 3; i++) {
+ HashMap userInfo = new HashMap();
+ userInfo.put("NAME", "User" + i);
+ userInfo.put("EMAIL", "aa@bb.com");
+ userList.add(userInfo);
+ }
+
+ return userList;
+ }
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DataGenerator.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DataGenerator.java
new file mode 100644
index 0000000000..6e9f1c2e84
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DataGenerator.java
@@ -0,0 +1,64 @@
+/**
+ * 版权 (c) 2017 palmshe.com
+ * 保留所有权利。
+ */
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author palmshe
+ * @date 2017年6月11日 下午10:24:46
+ */
+public class DataGenerator {
+
+ /**
+ * @Description:获取商品
+ * @param file
+ * @return
+ * @throws IOException
+ */
+ public static Map generateGoods(File file) throws IOException{
+ Map good= new HashMap();
+ BufferedReader br = null;
+ try {
+ br = new BufferedReader(new FileReader(file));
+ String temp = br.readLine();
+ String[] data = temp.split(" ");
+
+ good.put(PromotionMail.ID_KEY, data[0]);
+ good.put(PromotionMail.DESC_KEY, data[1]);
+
+ System.out.println("产品ID = " + data[0] + "\n");
+ System.out.println("产品描述 = " + data[1] + "\n");
+
+ } catch (IOException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ br.close();
+ }
+ return good;
+ }
+
+ /**
+ * @Description:获取客户
+ * @param good
+ * @return
+ * @throws Exception
+ */
+ public static List loadMailingList(Map good) throws Exception {
+ String id= (String)good.get(PromotionMail.ID_KEY);
+ String sendMailQuery = "Select name from subscriptions "
+ + "where product_id= '" + id +"' "
+ + "and send_mail=1 ";
+
+ return DBUtil.query(sendMailQuery);
+ }
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..e31d8a9b75
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,41 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+ private static String fromAddress;
+ private static String smtpServer;
+ private static String altSmtpServer;
+
+ public MailUtil(String fromAddress, String smtpServer, String altSmtpServer){
+ this.fromAddress= fromAddress;
+ this.smtpServer= smtpServer;
+ this.altSmtpServer= altSmtpServer;
+ }
+
+ /**
+ * @Description:发送邮件
+ * @param pm
+ * @param debug
+ */
+ public void sendEmail(PromotionMail pm, boolean debug){
+ try {
+ sendEmail(fromAddress, pm.toAddress, pm.subject, pm.message, smtpServer, debug);
+ } catch (Exception e1) {
+ try {
+ sendEmail(fromAddress, pm.toAddress, pm.subject, pm.message, altSmtpServer, debug);
+ } catch (Exception e2) {
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+ }
+ }
+ }
+
+ private void sendEmail(String from, String to, String subject, String message, String server, boolean debug){
+// 假装发了一封邮件
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(from).append("\n");
+ buffer.append("To:").append(to).append("\n");
+ buffer.append("Subject:").append(subject).append("\n");
+ buffer.append("Content:").append(message).append("\n");
+ System.out.println(buffer.toString());
+ }
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java
new file mode 100644
index 0000000000..9e8a514191
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java
@@ -0,0 +1,34 @@
+/**
+ * 版权 (c) 2017 palmshe.com
+ * 保留所有权利。
+ */
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author palmshe
+ * @date 2017年6月12日 下午10:07:23
+ */
+public class Main {
+ public static void main(String[] args) {
+ try {
+ File f = new File("C:\\Users\\Administrator.PC-20170125UBDJ\\Desktop\\coder2017\\coding2017\\students\\1132643730\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+ MailUtil maiUtil= new MailUtil(Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN), Configuration.getProperty(ConfigurationKeys.SMTP_SERVER), Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+ Map good = DataGenerator.generateGoods(f);
+ List users= DataGenerator.loadMailingList(good);
+ if (!users.isEmpty()) {
+ Iterator it= users.iterator();
+ while (it.hasNext()) {
+ maiUtil.sendEmail(new PromotionMail((Map)it.next(), good), true);
+ }
+ }
+ } catch (Exception e) {
+ System.out.println("构造发送邮件数据失败:"+ e.getMessage());
+ }
+ }
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..a773d878ee
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+
+import java.util.Map;
+
+public class PromotionMail {
+
+ protected String toAddress = null;
+ protected String subject = null;
+ protected String message = null;
+ protected String productID = null;
+ protected String productDesc = null;
+
+ protected static final String NAME_KEY = "NAME";
+ protected static final String EMAIL_KEY = "EMAIL";
+ protected static final String ID_KEY = "ID";
+ protected static final String DESC_KEY = "DESC";
+
+ public PromotionMail(Map user, Map good){
+ String name = (String)user.get(NAME_KEY);
+ this.productDesc= (String)good.get(DESC_KEY);
+ this.productID= (String)good.get(ID_KEY);
+ this.toAddress= (String)user.get(EMAIL_KEY);
+ this.subject = "您关注的产品降价了";
+ this.message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了,欢迎购买!" ;
+ }
+}
diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/1132643730/readme.md b/students/1132643730/readme.md
new file mode 100644
index 0000000000..fdae662c31
--- /dev/null
+++ b/students/1132643730/readme.md
@@ -0,0 +1 @@
+### 学着使用git
\ No newline at end of file
diff --git a/students/2756638003/srp/pom.xml b/students/2756638003/srp/pom.xml
new file mode 100644
index 0000000000..5024466d17
--- /dev/null
+++ b/students/2756638003/srp/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+
+ com.coderising
+ ds-assignment
+ 0.0.1-SNAPSHOT
+ jar
+
+ ds-assignment
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+ aliyunmaven
+ http://maven.aliyun.com/nexus/content/groups/public/
+
+
+
diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..6f743552bb
--- /dev/null
+++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,131 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import com.coderising.ood.srp.conf.Configuration;
+import com.coderising.ood.srp.conf.ConfigurationKeys;
+import com.coderising.ood.srp.conf.EmailStatus;
+import com.coderising.ood.srp.domain.Product;
+import com.coderising.ood.srp.domain.Subscriber;
+import com.coderising.ood.srp.util.ConfigUtil;
+import com.coderising.ood.srp.util.Email;
+import com.coderising.ood.srp.util.MailUtil;
+import com.coderising.ood.srp.util.SubscriberUtil;
+
+public class PromotionMail {
+
+ protected String smtpHost = null;
+ protected String altSmtpHost = null;
+ protected String fromAddress = null;
+
+ private static Configuration config;
+
+ public static void main(String[] args) throws Exception {
+ File file = new File("XX/product_promotion.txt");
+ boolean emailDebug = false;
+ new PromotionMail(file, emailDebug);
+ }
+
+ /**
+ * 从配置文件中读取商品信息
+ */
+ private List loadFile(File file) throws IOException {
+ Map conf = ConfigUtil.readTextFile(file);
+ List productList = new ArrayList(16);
+ Set> entrySet = conf.entrySet();
+ for (Entry entry : entrySet) {
+ productList.add(new Product(entry.getKey(), entry.getValue()));
+ }
+ return productList;
+ }
+
+ /**
+ * 根据商品查询订阅的用户信息
+ */
+ private List querySubscribersFormFile(List productList)
+ throws IOException {
+ StringBuilder query = new StringBuilder(
+ "Select name from Subscriber where product_id in( ");
+ for (int i = 0, len = productList.size(); i < len - 1; i++) {
+ query.append(productList.get(i).getProductID() + " ,");
+ }
+ query.append(productList.get(productList.size() - 1).getProductID());
+ query.append(") and send_mail = ?");
+ return SubscriberUtil.loadSubscriberList(query.toString(),
+ EmailStatus.READY);
+ }
+
+ /**
+ * 根据订阅者信息生成邮件
+ */
+ private Email generatorEmail(Subscriber subscriber, String host) {
+ String subject = "您关注的产品降价了";
+ String message = "尊敬的 " + subscriber.getName() + ", 您关注的产品 "
+ + subscriber.getProduct().getProductDesc() + " 降价了,欢迎购买!";
+ return new Email(subscriber.getEmail(), fromAddress, subject, message,
+ host);
+ }
+
+ public PromotionMail(File file, boolean mailDebug) throws Exception {
+ config = new Configuration();
+ setSMTPHost();
+ setAltSMTPHost();
+ setFromAddress();
+ // 从配置文件中读取商品信息
+ List productList = loadFile(file);
+ // 根据商品查询订阅的用户信息
+ List subscriberList = querySubscribersFormFile(productList);
+ // 发送邮件
+ sendEMails(mailDebug, subscriberList);
+ }
+
+ /**
+ * 发送邮件
+ */
+ protected void sendEMails(boolean debug, List subscriberList)
+ throws IOException {
+ System.out.println("开始发送邮件");
+ if (subscriberList != null && subscriberList.size() > 0) {
+ Iterator iter = subscriberList.iterator();
+ Subscriber subscriber = null;
+
+ while (iter.hasNext()) {
+ subscriber = iter.next();
+ try {
+ MailUtil.sendEmail(generatorEmail(subscriber, smtpHost),
+ debug);
+ } catch (Exception e) {
+ try {
+ MailUtil.sendEmail(
+ generatorEmail(subscriber, altSmtpHost), debug);
+ } catch (Exception e2) {
+ System.out.println("通过备用 SMTP服务器发送邮件失败: "
+ + e2.getMessage());
+ }
+ }
+ }
+ } else {
+ System.out.println("没有邮件发送");
+ }
+ }
+
+ protected void setSMTPHost() {
+ smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+ }
+
+ protected void setAltSMTPHost() {
+ altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+ }
+
+ protected void setFromAddress() {
+ fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ }
+
+}
diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/Configuration.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/Configuration.java
new file mode 100644
index 0000000000..444e4cf912
--- /dev/null
+++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/Configuration.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.conf;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 邮件服务器配置文件
+ */
+public class Configuration {
+
+ static Map configurations = new HashMap<>();
+
+ static {
+ configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
+ }
+
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ *
+ * @param key
+ * @return
+ */
+ public String getProperty(String key) {
+ return configurations.get(key);
+ }
+
+}
diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/ConfigurationKeys.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/ConfigurationKeys.java
new file mode 100644
index 0000000000..36009abc3d
--- /dev/null
+++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.conf;
+
+public class ConfigurationKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/EmailStatus.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/EmailStatus.java
new file mode 100644
index 0000000000..3245a8d468
--- /dev/null
+++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/EmailStatus.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp.conf;
+
+/**
+ * 邮件发送状态常量
+ */
+public enum EmailStatus {
+ /**
+ * 未发送
+ */
+ READY(0),
+ /**
+ * 已发送
+ */
+ SEND(1),
+ /**
+ * 已查阅
+ */
+ RECEIVED(2),
+ /**
+ * 被退回
+ */
+ REJECTED(3);
+
+ @SuppressWarnings("unused")
+ private int value;
+
+ private EmailStatus(int value) {
+ this.value = value;
+ }
+
+}
diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/product_promotion.txt b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/product_promotion.txt
new file mode 100644
index 0000000000..a98917f829
--- /dev/null
+++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo R15
+P4955 Vivo X20
\ No newline at end of file
diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Product.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Product.java
new file mode 100644
index 0000000000..52656e0389
--- /dev/null
+++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Product.java
@@ -0,0 +1,43 @@
+package com.coderising.ood.srp.domain;
+
+/**
+ * 商品类
+ */
+public class Product {
+
+ private String productID;
+ private String productDesc;
+
+ public Product(String productID, String productDesc) {
+ super();
+ this.productID = productID;
+ this.productDesc = productDesc;
+ }
+
+ public Product() {
+ super();
+ }
+
+ public String getProductID() {
+ return productID;
+ }
+
+ public void setProductID(String productID) {
+ this.productID = productID;
+ }
+
+ public String getProductDesc() {
+ return productDesc;
+ }
+
+ public void setProductDesc(String productDesc) {
+ this.productDesc = productDesc;
+ }
+
+ @Override
+ public String toString() {
+ return "Product [productID=" + productID + ", productDesc="
+ + productDesc + "]";
+ }
+
+}
diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Subscriber.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Subscriber.java
new file mode 100644
index 0000000000..cdef11498f
--- /dev/null
+++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Subscriber.java
@@ -0,0 +1,74 @@
+package com.coderising.ood.srp.domain;
+
+/**
+ * 订阅者
+ */
+public class Subscriber {
+
+ private String subscriberId;
+ private String name;
+ private String email;
+ private Product product;
+ private Integer sendStatus;
+
+ public Subscriber(String subscriberId, String name, String email,
+ Product product) {
+ super();
+ this.subscriberId = subscriberId;
+ this.name = name;
+ this.email = email;
+ this.product = product;
+ }
+
+ public Subscriber() {
+ super();
+ }
+
+ public String getSubscriberId() {
+ return subscriberId;
+ }
+
+ public void setSubscriberId(String subscriberId) {
+ this.subscriberId = subscriberId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public Product getProduct() {
+ return product;
+ }
+
+ public void setProduct(Product product) {
+ this.product = product;
+ }
+
+ public Integer getSendStatus() {
+ return sendStatus;
+ }
+
+ public void setSendStatus(Integer sendStatus) {
+ this.sendStatus = sendStatus;
+ }
+
+ @Override
+ public String toString() {
+ return "Subscriber [subscriberId=" + subscriberId + ", name=" + name
+ + ", email=" + email + ", product=" + product + ", sendStatus="
+ + sendStatus + "]";
+ }
+
+}
diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/ConfigUtil.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/ConfigUtil.java
new file mode 100644
index 0000000000..4494739dd6
--- /dev/null
+++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/ConfigUtil.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 配置文件读写工具类
+ *
+ */
+public class ConfigUtil {
+
+ public static Map readTextFile(File file)
+ throws IOException {
+ Map conf = new HashMap();
+ try (BufferedReader br = new BufferedReader(new FileReader(file));) {
+ String temp = null;
+ while ((temp = br.readLine()) != null) {
+ int indexOf = temp.indexOf(' ');
+ if (indexOf > -1) {
+ conf.put(temp.substring(0, indexOf),
+ temp.substring(indexOf));
+ }
+ }
+ } catch (IOException e) {
+ throw new IOException(e.getMessage());
+ }
+ return conf;
+ }
+}
diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 0000000000..a4facaff0b
--- /dev/null
+++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp.domain.Product;
+import com.coderising.ood.srp.domain.Subscriber;
+
+public class DBUtil {
+
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ *
+ * @param sql
+ * @return
+ */
+ public static List query(String sql, Object... args) {
+ List list = new ArrayList(16);
+ for (int i = 1; i <= 3; i++) {
+ list.add(new Subscriber(String.valueOf(i), "User" + i, "user-" + i
+ + "@bb.com", new Product("P8756", " iPhone8")));
+ }
+ return list;
+ }
+}
diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/Email.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/Email.java
new file mode 100644
index 0000000000..3422aebb2a
--- /dev/null
+++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/Email.java
@@ -0,0 +1,75 @@
+package com.coderising.ood.srp.util;
+
+/**
+ * 邮件类
+ */
+public class Email {
+
+ private String toAddress;
+ private String fromAddress;
+ private String subject;
+ private String message;
+ private String smtpHost;
+
+ public Email(String toAddress, String fromAddress, String subject,
+ String message, String smtpHost) {
+ super();
+ this.toAddress = toAddress;
+ this.fromAddress = fromAddress;
+ this.subject = subject;
+ this.message = message;
+ this.smtpHost = smtpHost;
+ }
+
+ public Email() {
+ super();
+ }
+
+ public String getToAddress() {
+ return toAddress;
+ }
+
+ public void setToAddress(String toAddress) {
+ this.toAddress = toAddress;
+ }
+
+ public String getFromAddress() {
+ return fromAddress;
+ }
+
+ public void setFromAddress(String fromAddress) {
+ this.fromAddress = fromAddress;
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public String getSmtpHost() {
+ return smtpHost;
+ }
+
+ public void setSmtpHost(String smtpHost) {
+ this.smtpHost = smtpHost;
+ }
+
+ @Override
+ public String toString() {
+ return "Email [toAddress=" + toAddress + ", fromAddress=" + fromAddress
+ + ", subject=" + subject + ", message=" + message
+ + ", smtpHost=" + smtpHost + "]";
+ }
+
+}
diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..7994870bef
--- /dev/null
+++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp.util;
+
+/**
+ * 邮件发送工具类
+ */
+public class MailUtil {
+ public static void sendEmail(Email email, boolean debug) {
+ // 假装发了一封邮件
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(email.getFromAddress()).append("\n");
+ buffer.append("To:").append(email.getToAddress()).append("\n");
+ buffer.append("Subject:").append(email.getSubject()).append("\n");
+ buffer.append("Content:").append(email.getMessage()).append("\n");
+ System.out.println(buffer.toString());
+ }
+
+}
diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/SubscriberUtil.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/SubscriberUtil.java
new file mode 100644
index 0000000000..2410a45950
--- /dev/null
+++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/SubscriberUtil.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp.util;
+
+import java.util.List;
+
+import com.coderising.ood.srp.domain.Subscriber;
+
+/**
+ * 订阅者查询工具类
+ */
+public class SubscriberUtil {
+
+ public static List loadSubscriberList(String sql,
+ Object... args) {
+ return DBUtil.query(sql);
+ }
+
+}
diff --git a/students/2816977791/ood/ood-assignment/pom.xml b/students/2816977791/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+
+ com.coderising
+ ood-assignment
+ 0.0.1-SNAPSHOT
+ jar
+
+ ood-assignment
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+ aliyunmaven
+ http://maven.aliyun.com/nexus/content/groups/public/
+
+
+
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..0d0d01098f
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class DateUtil {
+
+ public static String getCurrentDateAsString() {
+
+ return null;
+ }
+
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/LogMsgConvert.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/LogMsgConvert.java
new file mode 100644
index 0000000000..a2c2d82a98
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/LogMsgConvert.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp;
+
+/**
+ * @author nvarchar
+ * date 2017/6/28
+ */
+public interface LogMsgConvert {
+ String getLogFromMsg(String msg);
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..532dc9a611
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+
+ Sender sender;
+ LogMsgConvert convert;
+
+ public Logger(int logType, int logMethod) {
+ convert = RawLogFactory.createFormatter(logType);
+ sender = SenderFactory.createSenderFormat(logMethod);
+ }
+
+ public void log(String msg) {
+ sender.send(convert.getLogFromMsg(msg));
+ }
+
+ public static void main(String[] args) {
+ Logger logger = new Logger(1, 3);
+ logger.log("123");
+ }
+}
+
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailSender.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailSender.java
new file mode 100644
index 0000000000..5fa0c23759
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailSender.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+/**
+ * @author nvarchar
+ * date 2017/6/28
+ */
+public class MailSender implements Sender {
+ @Override
+ public void send(String logMsg) {
+ MailUtil.send(logMsg);
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..59d77649a2
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class MailUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintSender.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintSender.java
new file mode 100644
index 0000000000..7e69eb15d9
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintSender.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+/**
+ * @author nvarchar
+ * date 2017/6/28
+ */
+public class PrintSender implements Sender {
+ @Override
+ public void send(String logMsg) {
+ System.out.println(logMsg);
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLog.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLog.java
new file mode 100644
index 0000000000..ebcfce56b9
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLog.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.ocp;
+
+/**
+ * @author nvarchar
+ * date 2017/6/28
+ */
+public class RawLog implements LogMsgConvert{
+
+ @Override
+ public String getLogFromMsg(String msg) {
+ String logMsg = msg;
+ return logMsg;
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogFactory.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogFactory.java
new file mode 100644
index 0000000000..c593ae3ace
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogFactory.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.ocp;
+
+/**
+ * @author nvarchar
+ * date 2017/6/28
+ */
+public class RawLogFactory {
+ public static LogMsgConvert createFormatter(int type) {
+ if (type == 1) {
+ return new RawLog();
+ }
+ if (type == 2) {
+ return new RawLogWtihDate();
+ }
+ return null;
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogWtihDate.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogWtihDate.java
new file mode 100644
index 0000000000..a30ad24665
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogWtihDate.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.ocp;
+
+/**
+ * @author nvarchar
+ * date 2017/6/28
+ */
+public class RawLogWtihDate implements LogMsgConvert {
+
+ @Override
+ public String getLogFromMsg(String msg) {
+ String txtDate = DateUtil.getCurrentDateAsString();
+ String logMsg = txtDate + ": " + msg;
+ return logMsg;
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSSender.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSSender.java
new file mode 100644
index 0000000000..9a5f4a572a
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSSender.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+/**
+ * @author nvarchar
+ * date 2017/6/28
+ */
+public class SMSSender implements Sender {
+ @Override
+ public void send(String logMsg) {
+ SMSUtil.send(logMsg);
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..fab4cd01b7
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class SMSUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java
new file mode 100644
index 0000000000..7d0c47ed22
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp;
+
+/**
+ * @author nvarchar
+ * date 2017/6/28
+ */
+public interface Sender {
+ void send(String logMsg);
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java
new file mode 100644
index 0000000000..32c09afb78
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.ocp;
+
+/**
+ * @author nvarchar
+ * date 2017/6/28
+ */
+public class SenderFactory {
+
+ public static Sender createSenderFormat(int method) {
+ if (method == 1) {
+ return new MailSender();
+ } else if (method == 2) {
+ return new SMSSender();
+ } else if (method == 3) {
+ return new PrintSender();
+ }
+ return null;
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+ static Map configurations = new HashMap<>();
+ static{
+ configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
+ }
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ * @param key
+ * @return
+ */
+ public String getProperty(String key) {
+
+ return configurations.get(key);
+ }
+
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp;
+
+public class ConfigurationKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ * @param sql
+ * @return
+ */
+ public static List query(String sql){
+
+ List userList = new ArrayList();
+ for (int i = 1; i <= 3; i++) {
+ HashMap userInfo = new HashMap();
+ userInfo.put("NAME", "User" + i);
+ userInfo.put("EMAIL", "aa@bb.com");
+ userList.add(userInfo);
+ }
+
+ return userList;
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..eb8896e527
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author nvarchar
+ * date 2017/6/26
+ */
+public class FileUtil {
+
+ protected static String[] readFile(File file) throws IOException // @02C
+ {
+ return null;
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..9a72ea60d6
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * @author nvarchar
+ * date 2017/6/29
+ */
+public class Mail {
+ private User user;
+
+ public Mail(User u) {
+ this.user = u;
+ }
+
+ public String getAddress() {
+ return user.getEMailAddress();
+ }
+
+ public String getSubject() {
+ return "您关注的产品降价了";
+ }
+
+ public String getBody() {
+ return "尊敬的 " + user.getName() + ", 您关注的产品 " + this.buildProductDescList() + " 降价了,欢迎购买!";
+ }
+
+ private String buildProductDescList() {
+ List products = user.getSubscribedProducts();
+ //.... 实现略...
+ return null;
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java
new file mode 100644
index 0000000000..3e6788915d
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java
@@ -0,0 +1,46 @@
+package com.coderising.ood.srp;
+
+/**
+ * 发送邮件
+ *
+ * @author nvarchar
+ * date 2017/6/26
+ */
+public class MailService {
+ private String fromAddress;
+ private String smtpHost;
+ private String altSmtpHost;
+
+ public MailService(Configuration config) {
+ this.fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ this.smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+ this.altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+ }
+
+ public void sendMail(Mail mail) {
+ try {
+ sendEmail(mail, this.smtpHost);
+ } catch (Exception e) {
+ try {
+ sendEmail(mail, this.altSmtpHost);
+ } catch (Exception ex) {
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + ex.getMessage());
+ }
+
+ }
+ }
+
+ private void sendEmail(Mail mail, String smtpHost) {
+ String toAddress = mail.getAddress();
+ String subject = mail.getSubject();
+ String msg = mail.getBody();
+ //发送邮件
+ //假装发了一封邮件
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(fromAddress).append("\n");
+ buffer.append("To:").append(toAddress).append("\n");
+ buffer.append("Subject:").append(subject).append("\n");
+ buffer.append("Content:").append(msg).append("\n");
+ System.out.println(buffer.toString());
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..45cd069953
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp;
+
+/**
+ * @author nvarchar
+ * date 2017/6/29
+ */
+public class Product {
+ private String id;
+ private String desc;
+
+ public Product(String id, String desc) {
+ this.id = id;
+ this.desc = desc;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java
new file mode 100644
index 0000000000..b5c801e1a8
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author nvarchar
+ * date 2017/6/29
+ */
+public class ProductService {
+
+ public List getProductLists(String filePath) throws IOException {
+ List products = new ArrayList<>();
+ BufferedReader br = null;
+ try {
+ br = new BufferedReader(new FileReader(filePath));
+ String temp;
+ while ((temp = br.readLine()) != null) {
+ String[] data = temp.split(" ");
+ products.add(new Product(data[0], data[1]));
+ }
+ return products;
+ } catch (IOException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ br.close();
+ }
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMain.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMain.java
new file mode 100644
index 0000000000..aea2699c2c
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMain.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author nvarchar
+ * date 2017/6/29
+ */
+public class PromotionMain {
+ private ProductService productService = new ProductService();
+ private UserService userService = new UserService();
+
+ public void run(String filepath) throws IOException {
+
+ Configuration cfg = new Configuration();
+
+ List productList = productService.getProductLists(filepath);
+
+ Set users = new HashSet<>();
+ for (Product product : productList) {
+ List userList = userService.getUsers(product);
+ //todo 将userlist中的user和对应的product添加到users中
+ }
+ MailService mailService = new MailService(cfg);
+ for (User user : users) {
+ mailService.sendMail(new Mail(user));
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ String filePath = "/Users/nvarchar/Documents/github/coding2017-2/" +
+ "students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt";
+ PromotionMain main = new PromotionMain();
+ main.run(filePath);
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/User.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 0000000000..4d2ea42edc
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * @author nvarchar
+ * date 2017/6/29
+ */
+public class User {
+ private String name;
+ private String emailAddress;
+
+ private List products;
+
+ public String getName() {
+ return name;
+ }
+
+ public String getEMailAddress() {
+ return emailAddress;
+ }
+
+ public List getSubscribedProducts() {
+ return this.products;
+ }
+
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java
new file mode 100644
index 0000000000..3b2e68fb31
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * @author nvarchar
+ * date 2017/6/29
+ */
+public class UserService {
+
+ public List getUsers(Product product){
+ //调用DAO相关的类从数据库中读取订阅产品的用户列表
+ return null;
+ }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/282692248/ood/ood-assignment/pom.xml b/students/282692248/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+
+ com.coderising
+ ood-assignment
+ 0.0.1-SNAPSHOT
+ jar
+
+ ood-assignment
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+ aliyunmaven
+ http://maven.aliyun.com/nexus/content/groups/public/
+
+
+
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..b6cf28c096
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class DateUtil {
+
+ public static String getCurrentDateAsString() {
+
+ return null;
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..0357c4d912
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+
+ public final int RAW_LOG = 1;
+ public final int RAW_LOG_WITH_DATE = 2;
+ public final int EMAIL_LOG = 1;
+ public final int SMS_LOG = 2;
+ public final int PRINT_LOG = 3;
+
+ int type = 0;
+ int method = 0;
+
+ public Logger(int logType, int logMethod){
+ this.type = logType;
+ this.method = logMethod;
+ }
+ public void log(String msg){
+
+ String logMsg = msg;
+
+ if(this.type == RAW_LOG){
+ logMsg = msg;
+ } else if(this.type == RAW_LOG_WITH_DATE){
+ String txtDate = DateUtil.getCurrentDateAsString();
+ logMsg = txtDate + ": " + msg;
+ }
+
+ if(this.method == EMAIL_LOG){
+ MailUtil.send(logMsg);
+ } else if(this.method == SMS_LOG){
+ SMSUtil.send(logMsg);
+ } else if(this.method == PRINT_LOG){
+ System.out.println(logMsg);
+ }
+ }
+}
+
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..ec54b839c5
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class MailUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..13cf802418
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class SMSUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/DateUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/DateUtil.java
new file mode 100644
index 0000000000..7d0b475c45
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/DateUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.chasing;
+
+public class DateUtil {
+
+ public static String getCurrentDateAsString() {
+
+ return null;
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/Logger.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/Logger.java
new file mode 100644
index 0000000000..9ee56868e2
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/Logger.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.ocp.chasing;
+
+import com.coderising.ood.ocp.chasing.formatter.ILogFormatter;
+import com.coderising.ood.ocp.chasing.sender.ILogSender;
+
+public class Logger {
+
+ private ILogFormatter formatter;
+ private ILogSender sender;
+
+ public Logger(ILogFormatter formatter, ILogSender sender){
+ this.formatter = formatter;
+ this.sender = sender;
+ }
+ public void log(String msg){
+ sender.send(formatter.format(msg));
+ }
+}
+
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/MailUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/MailUtil.java
new file mode 100644
index 0000000000..3ebf73ec62
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.chasing;
+
+public class MailUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/SMSUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/SMSUtil.java
new file mode 100644
index 0000000000..5f649d963b
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.chasing;
+
+public class SMSUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/ILogFormatter.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/ILogFormatter.java
new file mode 100644
index 0000000000..0c713dde7d
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/ILogFormatter.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.ocp.chasing.formatter;
+
+public interface ILogFormatter {
+ String format(String txt);
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/LogWithDateFormatter.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/LogWithDateFormatter.java
new file mode 100644
index 0000000000..fb9555db9a
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/LogWithDateFormatter.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp.chasing.formatter;
+
+import com.coderising.ood.ocp.chasing.DateUtil;
+
+public class LogWithDateFormatter implements ILogFormatter {
+
+ @Override
+ public String format(String txt) {
+ return DateUtil.getCurrentDateAsString() + ": " + txt;
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/RawLog.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/RawLog.java
new file mode 100644
index 0000000000..fdf2008c54
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/RawLog.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.chasing.formatter;
+
+public class RawLog implements ILogFormatter {
+
+ @Override
+ public String format(String txt) {
+ return txt;
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/ILogSender.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/ILogSender.java
new file mode 100644
index 0000000000..339584d6e4
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/ILogSender.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.ocp.chasing.sender;
+
+public interface ILogSender {
+ void send(String msg);
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/MailSender.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/MailSender.java
new file mode 100644
index 0000000000..37652883ae
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/MailSender.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp.chasing.sender;
+
+import com.coderising.ood.ocp.chasing.MailUtil;
+
+public class MailSender implements ILogSender {
+
+ @Override
+ public void send(String msg) {
+ MailUtil.send(msg);
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/SMSSender.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/SMSSender.java
new file mode 100644
index 0000000000..2c7f92bf3b
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/SMSSender.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.chasing.sender;
+
+public class SMSSender implements ILogSender {
+
+ @Override
+ public void send(String msg) {
+ System.out.println(msg);
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/StdoutSender.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/StdoutSender.java
new file mode 100644
index 0000000000..7e10d45b4f
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/StdoutSender.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp.chasing.sender;
+
+import com.coderising.ood.ocp.chasing.SMSUtil;
+
+public class StdoutSender implements ILogSender {
+
+ @Override
+ public void send(String msg) {
+ SMSUtil.send(msg);
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java
new file mode 100644
index 0000000000..b6e2ccbc16
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp.good;
+
+public interface Formatter {
+
+ String format(String msg);
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java
new file mode 100644
index 0000000000..3c2009a674
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.good;
+
+public class FormatterFactory {
+ public static Formatter createFormatter(int type){
+ if(type == 1){
+ return new RawFormatter();
+ }
+ if (type == 2){
+ return new HtmlFormatter();
+ }
+ return null;
+ }
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java
new file mode 100644
index 0000000000..3d375f5acc
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp.good;
+
+public class HtmlFormatter implements Formatter {
+
+ @Override
+ public String format(String msg) {
+
+ return null;
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java
new file mode 100644
index 0000000000..f206472d0d
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.ocp.good;
+
+public class Logger {
+
+ private Formatter formatter;
+ private Sender sender;
+
+ public Logger(Formatter formatter,Sender sender){
+ this.formatter = formatter;
+ this.sender = sender;
+ }
+ public void log(String msg){
+ sender.send(formatter.format(msg)) ;
+ }
+
+
+}
+
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java
new file mode 100644
index 0000000000..7f1cb4ae30
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp.good;
+
+public class RawFormatter implements Formatter {
+
+ @Override
+ public String format(String msg) {
+
+ return null;
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java
new file mode 100644
index 0000000000..aaa46c1fb7
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp.good;
+
+public interface Sender {
+
+ void send(String msg);
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+ static Map configurations = new HashMap<>();
+ static{
+ configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
+ }
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ * @param key
+ * @return
+ */
+ public String getProperty(String key) {
+
+ return configurations.get(key);
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp;
+
+public class ConfigurationKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ * @param sql
+ * @return
+ */
+ public static List query(String sql){
+
+ List userList = new ArrayList();
+ for (int i = 1; i <= 3; i++) {
+ HashMap userInfo = new HashMap();
+ userInfo.put("NAME", "User" + i);
+ userInfo.put("EMAIL", "aa@bb.com");
+ userList.add(userInfo);
+ }
+
+ return userList;
+ }
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+ public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
+ boolean debug) {
+ //假装发了一封邮件
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(fromAddress).append("\n");
+ buffer.append("To:").append(toAddress).append("\n");
+ buffer.append("Subject:").append(subject).append("\n");
+ buffer.append("Content:").append(message).append("\n");
+ System.out.println(buffer.toString());
+
+ }
+
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..402c4f6f97
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,199 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+
+ protected String sendMailQuery = null;
+
+
+ protected String smtpHost = null;
+ protected String altSmtpHost = null;
+ protected String fromAddress = null;
+ protected String toAddress = null;
+ protected String subject = null;
+ protected String message = null;
+
+ protected String productID = null;
+ protected String productDesc = null;
+
+ private static Configuration config;
+
+
+
+ private static final String NAME_KEY = "NAME";
+ private static final String EMAIL_KEY = "EMAIL";
+
+
+ public static void main(String[] args) throws Exception {
+
+ File f = new File("D:\\jp\\study\\coding2017-master\\students\\282692248\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+ boolean emailDebug = false;
+
+ PromotionMail pe = new PromotionMail(f, emailDebug);
+
+ }
+
+
+ public PromotionMail(File file, boolean mailDebug) throws Exception {
+
+ //读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8
+ readFile(file);
+
+
+ config = new Configuration();
+
+ setSMTPHost();
+ setAltSMTPHost();
+
+
+ setFromAddress();
+
+
+ setLoadQuery();
+
+ sendEMails(mailDebug, loadMailingList());
+
+
+ }
+
+
+
+
+ protected void setProductID(String productID)
+ {
+ this.productID = productID;
+
+ }
+
+ protected String getproductID()
+ {
+ return productID;
+ }
+
+ protected void setLoadQuery() throws Exception {
+
+ sendMailQuery = "Select name from subscriptions "
+ + "where product_id= '" + productID +"' "
+ + "and send_mail=1 ";
+
+
+ System.out.println("loadQuery set");
+ }
+
+
+ protected void setSMTPHost()
+ {
+ smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+ }
+
+
+ protected void setAltSMTPHost()
+ {
+ altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+
+ }
+
+
+ protected void setFromAddress()
+ {
+ fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ }
+
+ protected void setMessage(HashMap userInfo) throws IOException
+ {
+
+ String name = (String) userInfo.get(NAME_KEY);
+
+ subject = "您关注的产品降价了";
+ message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了,欢迎购买!" ;
+
+
+
+ }
+
+
+ protected void readFile(File file) throws IOException // @02C
+ {
+ BufferedReader br = null;
+ try {
+ br = new BufferedReader(new FileReader(file));
+ String temp = br.readLine();
+ String[] data = temp.split(" ");
+
+ setProductID(data[0]);
+ setProductDesc(data[1]);
+
+ System.out.println("产品ID = " + productID + "\n");
+ System.out.println("产品描述 = " + productDesc + "\n");
+
+ } catch (IOException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ br.close();
+ }
+ }
+
+ private void setProductDesc(String desc) {
+ this.productDesc = desc;
+ }
+
+
+ protected void configureEMail(HashMap userInfo) throws IOException
+ {
+ toAddress = (String) userInfo.get(EMAIL_KEY);
+ if (toAddress.length() > 0)
+ setMessage(userInfo);
+ }
+
+ protected List loadMailingList() throws Exception {
+ return DBUtil.query(this.sendMailQuery);
+ }
+
+
+ protected void sendEMails(boolean debug, List mailingList) throws IOException
+ {
+
+ System.out.println("开始发送邮件");
+
+
+ if (mailingList != null) {
+ Iterator iter = mailingList.iterator();
+ while (iter.hasNext()) {
+ configureEMail((HashMap) iter.next());
+ try
+ {
+ if (toAddress.length() > 0)
+ MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+ }
+ catch (Exception e)
+ {
+
+ try {
+ MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug);
+
+ } catch (Exception e2)
+ {
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+ }
+ }
+ }
+
+
+ }
+
+ else {
+ System.out.println("没有邮件发送");
+
+ }
+
+ }
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/Configuration.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/Configuration.java
new file mode 100644
index 0000000000..a34fd144aa
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.chasing;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+ static Map configurations = new HashMap<>();
+ static{
+ configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
+ }
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ * @param key
+ * @return
+ */
+ public String getProperty(String key) {
+
+ return configurations.get(key);
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/ConfigurationKeys.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/ConfigurationKeys.java
new file mode 100644
index 0000000000..9d0f0caa1b
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.chasing;
+
+public class ConfigurationKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/PromotionMail.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/PromotionMail.java
new file mode 100644
index 0000000000..8008f6b11b
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/PromotionMail.java
@@ -0,0 +1,45 @@
+package com.coderising.ood.srp.chasing;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import com.coderising.ood.srp.chasing.model.Product;
+import com.coderising.ood.srp.chasing.model.User;
+import com.coderising.ood.srp.chasing.service.MailService;
+import com.coderising.ood.srp.chasing.service.ProductService;
+import com.coderising.ood.srp.chasing.service.PromotionService;
+import com.coderising.ood.srp.chasing.service.UserService;
+
+public class PromotionMail {
+ private MailService mailServer = new MailService(new Configuration());;
+ private ProductService productService = null;
+ private UserService userService = new UserService();
+ private PromotionService promptService = new PromotionService();
+
+ public static void main(String[] args) throws Exception {
+ File f = new File("D:\\coding2017\\students\\282692248\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\chasing\\product_promotion.txt");
+ PromotionMail pe = new PromotionMail(f);
+ pe.sendPromptMails();
+ }
+
+ public PromotionMail(File file){
+ productService = new ProductService(file);
+ }
+
+ /** 主要业务逻辑:发送促销信息 */
+ protected void sendPromptMails() throws IOException {
+ System.out.println("开始发送邮件");
+ Product product = productService.loadProduct();
+ List users = userService.loadUserByProduct(product);
+ if (users != null) {
+ for(User user:users){
+ mailServer.sendMail(user.getEmail(), promptService.getPromptProfile(),
+ promptService.buildPromptMessageForUser(product, user));
+ }
+ }
+ else {
+ System.out.println("没有邮件发送");
+ }
+ }
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/Product.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/Product.java
new file mode 100644
index 0000000000..a4843a26c6
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/Product.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp.chasing.model;
+
+public class Product {
+ protected String productID = null;
+ protected String productDesc = null;
+
+ public Product() {}
+
+ public Product(String productID, String productDesc) {
+ super();
+ this.productID = productID;
+ this.productDesc = productDesc;
+ }
+
+ public String getProductID() {
+ return productID;
+ }
+ public void setProductID(String productID) {
+ this.productID = productID;
+ }
+ public String getProductDesc() {
+ return productDesc;
+ }
+ public void setProductDesc(String productDesc) {
+ this.productDesc = productDesc;
+ }
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/User.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/User.java
new file mode 100644
index 0000000000..aed750d6ce
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/User.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.chasing.model;
+
+public class User {
+ private String name;
+ private String email;
+
+ public User(String name, String email) {
+ super();
+ this.name = name;
+ this.email = email;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getEmail() {
+ return email;
+ }
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/product_promotion.txt b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/MailService.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/MailService.java
new file mode 100644
index 0000000000..957eac2928
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/MailService.java
@@ -0,0 +1,62 @@
+package com.coderising.ood.srp.chasing.service;
+
+import com.coderising.ood.srp.chasing.Configuration;
+import com.coderising.ood.srp.chasing.ConfigurationKeys;
+import com.coderising.ood.srp.chasing.util.MailUtil;
+
+public class MailService {
+ protected String smtpHost = null;
+ protected String altSmtpHost = null;
+ protected String systemAddress = null;
+
+ public MailService(Configuration config){
+ smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+ altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+ systemAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ }
+
+ /**
+ * 发送邮件
+ * @param toAddress 收信人
+ * @param subject 主题
+ * @param message 正文
+ */
+ public void sendMail(String toAddress, String subject, String message){
+ if(toAddress == null || toAddress.length() <= 0){
+ return;
+ }
+ try{
+ MailUtil.sendEmail(toAddress, systemAddress, subject, message, smtpHost);
+ }catch(Exception e){
+ try{
+ MailUtil.sendEmail(toAddress, systemAddress, subject, message, altSmtpHost);
+ }catch(Exception e2){
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+ }
+ }
+ }
+
+ public String getSmtpHost() {
+ return smtpHost;
+ }
+
+ public void setSmtpHost(String smtpHost) {
+ this.smtpHost = smtpHost;
+ }
+
+ public String getAltSmtpHost() {
+ return altSmtpHost;
+ }
+
+ public void setAltSmtpHost(String altSmtpHost) {
+ this.altSmtpHost = altSmtpHost;
+ }
+
+ public String getFromAddress() {
+ return systemAddress;
+ }
+
+ public void setFromAddress(String fromAddress) {
+ this.systemAddress = fromAddress;
+ }
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/ProductService.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/ProductService.java
new file mode 100644
index 0000000000..00e55a806b
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/ProductService.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp.chasing.service;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+import com.coderising.ood.srp.chasing.model.Product;
+
+public class ProductService {
+ File f;
+ public ProductService(File f){
+ this.f = f;
+ }
+ /** 获取促销商品 */
+ public Product loadProduct() throws IOException // @02C
+ {
+ BufferedReader br = null;
+ try {
+ br = new BufferedReader(new FileReader(f));
+ String temp = br.readLine();
+ String[] data = temp.split(" ");
+ System.out.println("产品ID = " + data[0] + "\n");
+ System.out.println("产品描述 = " + data[1] + "\n");
+ return new Product(data[0], data[1]);
+ } catch (IOException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ br.close();
+ }
+ }
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/PromotionService.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/PromotionService.java
new file mode 100644
index 0000000000..a4f3aa0a12
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/PromotionService.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp.chasing.service;
+
+import java.io.IOException;
+
+import com.coderising.ood.srp.chasing.model.Product;
+import com.coderising.ood.srp.chasing.model.User;
+
+public class PromotionService {
+ /** 促销信息概要 */
+ public String getPromptProfile(){
+ return "您关注的产品降价了";
+ }
+
+ /** 为指定用户生成促销信息 */
+ public String buildPromptMessageForUser(Product product, User userInfo) throws IOException {
+ return "尊敬的 "+userInfo.getName()+", 您关注的产品 " + product.getProductDesc() + " 降价了,欢迎购买!" ;
+ }
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/UserService.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/UserService.java
new file mode 100644
index 0000000000..ccc8a44b31
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/UserService.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp.chasing.service;
+
+import java.util.List;
+
+import com.coderising.ood.srp.chasing.model.Product;
+import com.coderising.ood.srp.chasing.model.User;
+import com.coderising.ood.srp.chasing.util.DBUtil;
+
+public class UserService {
+ /** 获取关注指定商品的用户 */
+ public List loadUserByProduct(Product product){
+ String sql = "Select name from subscriptions "
+ + "where product_id= '" + product.getProductID() +"' "
+ + "and send_mail=1 ";
+ System.out.println("loadQuery set");
+ return DBUtil.query(sql);
+ }
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/DBUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/DBUtil.java
new file mode 100644
index 0000000000..a1f5faf1f4
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/DBUtil.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp.chasing.util;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp.chasing.model.User;
+
+public class DBUtil {
+
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ * @param sql
+ * @return
+ */
+ public static List query(String sql){
+ List userList = new ArrayList<>();
+ for (int i = 1; i <= 3; i++) {
+ userList.add(new User("User" + i,"aa@bb.com"));
+ }
+ return userList;
+ }
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/MailUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/MailUtil.java
new file mode 100644
index 0000000000..6bc230b7bb
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/MailUtil.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.srp.chasing.util;
+
+public class MailUtil {
+
+ public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost) {
+ //假装发了一封邮件
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(fromAddress).append("\n");
+ buffer.append("To:").append(toAddress).append("\n");
+ buffer.append("Subject:").append(subject).append("\n");
+ buffer.append("Content:").append(message).append("\n");
+ System.out.println(buffer.toString());
+ }
+}
diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/395135865/ood/ood-assignment/pom.xml b/students/395135865/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+
+ com.coderising
+ ood-assignment
+ 0.0.1-SNAPSHOT
+ jar
+
+ ood-assignment
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+ aliyunmaven
+ http://maven.aliyun.com/nexus/content/groups/public/
+
+
+
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..d2205cdbe7
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+ static Map configurations = new HashMap<>();
+
+ static {
+ configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
+ }
+
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ */
+ public String getProperty(String key) {
+ return configurations.get(key);
+ }
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp;
+
+public class ConfigurationKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ * @param sql
+ * @return
+ */
+ public static List query(String sql){
+
+ List userList = new ArrayList();
+ for (int i = 1; i <= 3; i++) {
+ HashMap userInfo = new HashMap();
+ userInfo.put("NAME", "User" + i);
+ userInfo.put("EMAIL", "aa@bb.com");
+ userList.add(userInfo);
+ }
+
+ return userList;
+ }
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+ public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
+ boolean debug) {
+ //假装发了一封邮件
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(fromAddress).append("\n");
+ buffer.append("To:").append(toAddress).append("\n");
+ buffer.append("Subject:").append(subject).append("\n");
+ buffer.append("Content:").append(message).append("\n");
+ System.out.println(buffer.toString());
+
+ }
+
+
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,199 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+
+ protected String sendMailQuery = null;
+
+
+ protected String smtpHost = null;
+ protected String altSmtpHost = null;
+ protected String fromAddress = null;
+ protected String toAddress = null;
+ protected String subject = null;
+ protected String message = null;
+
+ protected String productID = null;
+ protected String productDesc = null;
+
+ private static Configuration config;
+
+
+
+ private static final String NAME_KEY = "NAME";
+ private static final String EMAIL_KEY = "EMAIL";
+
+
+ public static void main(String[] args) throws Exception {
+
+ File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+ boolean emailDebug = false;
+
+ PromotionMail pe = new PromotionMail(f, emailDebug);
+
+ }
+
+
+ public PromotionMail(File file, boolean mailDebug) throws Exception {
+
+ //读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8
+ readFile(file);
+
+
+ config = new Configuration();
+
+ setSMTPHost();
+ setAltSMTPHost();
+
+
+ setFromAddress();
+
+
+ setLoadQuery();
+
+ sendEMails(mailDebug, loadMailingList());
+
+
+ }
+
+
+
+
+ protected void setProductID(String productID)
+ {
+ this.productID = productID;
+
+ }
+
+ protected String getproductID()
+ {
+ return productID;
+ }
+
+ protected void setLoadQuery() throws Exception {
+
+ sendMailQuery = "Select name from subscriptions "
+ + "where product_id= '" + productID +"' "
+ + "and send_mail=1 ";
+
+
+ System.out.println("loadQuery set");
+ }
+
+
+ protected void setSMTPHost()
+ {
+ smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+ }
+
+
+ protected void setAltSMTPHost()
+ {
+ altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+
+ }
+
+
+ protected void setFromAddress()
+ {
+ fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ }
+
+ protected void setMessage(HashMap userInfo) throws IOException
+ {
+
+ String name = (String) userInfo.get(NAME_KEY);
+
+ subject = "您关注的产品降价了";
+ message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了,欢迎购买!" ;
+
+
+
+ }
+
+
+ protected void readFile(File file) throws IOException // @02C
+ {
+ BufferedReader br = null;
+ try {
+ br = new BufferedReader(new FileReader(file));
+ String temp = br.readLine();
+ String[] data = temp.split(" ");
+
+ setProductID(data[0]);
+ setProductDesc(data[1]);
+
+ System.out.println("产品ID = " + productID + "\n");
+ System.out.println("产品描述 = " + productDesc + "\n");
+
+ } catch (IOException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ br.close();
+ }
+ }
+
+ private void setProductDesc(String desc) {
+ this.productDesc = desc;
+ }
+
+
+ protected void configureEMail(HashMap userInfo) throws IOException
+ {
+ toAddress = (String) userInfo.get(EMAIL_KEY);
+ if (toAddress.length() > 0)
+ setMessage(userInfo);
+ }
+
+ protected List loadMailingList() throws Exception {
+ return DBUtil.query(this.sendMailQuery);
+ }
+
+
+ protected void sendEMails(boolean debug, List mailingList) throws IOException
+ {
+
+ System.out.println("开始发送邮件");
+
+
+ if (mailingList != null) {
+ Iterator iter = mailingList.iterator();
+ while (iter.hasNext()) {
+ configureEMail((HashMap) iter.next());
+ try
+ {
+ if (toAddress.length() > 0)
+ MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+ }
+ catch (Exception e)
+ {
+
+ try {
+ MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug);
+
+ } catch (Exception e2)
+ {
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+ }
+ }
+ }
+
+
+ }
+
+ else {
+ System.out.println("没有邮件发送");
+
+ }
+
+ }
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Email.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Email.java
new file mode 100644
index 0000000000..7943a5581a
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Email.java
@@ -0,0 +1,56 @@
+package com.thomsom.coderising.ood.srp;
+
+/**
+ * the email message entity class.
+ *
+ * @author Thomson Tang
+ * @version Created: 23/06/2017.
+ */
+public class Email {
+ private String fromAddress;
+ private String toAddress;
+ private String subject;
+ private String content;
+
+ public Email() {
+ }
+
+ public Email(String fromAddress, String toAddress, String subject, String content) {
+ this.fromAddress = fromAddress;
+ this.toAddress = toAddress;
+ this.subject = subject;
+ this.content = content;
+ }
+
+ public String getFromAddress() {
+ return fromAddress;
+ }
+
+ public void setFromAddress(String fromAddress) {
+ this.fromAddress = fromAddress;
+ }
+
+ public String getToAddress() {
+ return toAddress;
+ }
+
+ public void setToAddress(String toAddress) {
+ this.toAddress = toAddress;
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Product.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..9fca6b61db
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Product.java
@@ -0,0 +1,44 @@
+package com.thomsom.coderising.ood.srp;
+
+/**
+ * Product entity class.
+ *
+ * @author Thomson Tang
+ * @version Created: 23/06/2017.
+ */
+public class Product {
+ private String productId;
+ private String productName;
+
+ private Product() {
+ }
+
+ private Product(String productId, String productName) {
+ this.productId = productId;
+ this.productName = productName;
+ }
+
+ public static Product newInstance(String productId, String productName) {
+ return new Product(productId, productName);
+ }
+
+ public static Product newInstance() {
+ return new Product();
+ }
+
+ public String getProductId() {
+ return productId;
+ }
+
+ public void setProductId(String productId) {
+ this.productId = productId;
+ }
+
+ public String getProductName() {
+ return productName;
+ }
+
+ public void setProductName(String productName) {
+ this.productName = productName;
+ }
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/PromotionTask.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/PromotionTask.java
new file mode 100644
index 0000000000..91fd78926a
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/PromotionTask.java
@@ -0,0 +1,24 @@
+package com.thomsom.coderising.ood.srp;
+
+import com.thomsom.coderising.ood.srp.service.EmailService;
+import com.thomsom.coderising.ood.srp.service.impl.EmailServiceImpl;
+
+import java.util.List;
+
+/**
+ * 应用场景类: 促销任务
+ *
+ * @author Thomson Tang
+ * @version Created: 02/07/2017.
+ */
+public class PromotionTask {
+ public static void main(String[] args) {
+ try {
+ EmailService emailService = new EmailServiceImpl();
+ List emails = emailService.createEmails();
+ emailService.sendEmails(emails);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/UserInfo.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/UserInfo.java
new file mode 100644
index 0000000000..bf653eb20d
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/UserInfo.java
@@ -0,0 +1,59 @@
+package com.thomsom.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * the user info entity class.
+ *
+ * @author Thomson Tang
+ * @version Created: 23/06/2017.
+ */
+public class UserInfo {
+ private String userId;
+ private String userName;
+ private String email;
+
+ List products = new ArrayList<>();
+
+ public UserInfo() {
+ }
+
+ public UserInfo(String userId, String userName, String email) {
+ this.userId = userId;
+ this.userName = userName;
+ this.email = email;
+ }
+
+ public String getUserId() {
+ return userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public List getProducts() {
+ return products;
+ }
+
+ public void setProducts(List products) {
+ this.products = products;
+ }
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java
new file mode 100644
index 0000000000..d922b9fe0f
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java
@@ -0,0 +1,28 @@
+package com.thomsom.coderising.ood.srp.service;
+
+import com.thomsom.coderising.ood.srp.Email;
+
+import java.util.List;
+
+/**
+ * 邮件服务
+ *
+ * @author Thomson Tang
+ * @version Created: 29/06/2017.
+ */
+public interface EmailService {
+ /**
+ * 创建要发送的邮件,相当于写邮件
+ *
+ * @return 返回若干邮件
+ * @throws Exception if error
+ */
+ List createEmails() throws Exception;
+
+ /**
+ * 发送邮件
+ * @param emails 要发送的邮件
+ * @throws Exception if error occurs
+ */
+ void sendEmails(List emails) throws Exception;
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/MailSender.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/MailSender.java
new file mode 100644
index 0000000000..163db708e7
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/MailSender.java
@@ -0,0 +1,20 @@
+package com.thomsom.coderising.ood.srp.service;
+
+import com.thomsom.coderising.ood.srp.Email;
+
+import java.util.List;
+
+/**
+ * 邮件发送服务
+ *
+ * @author Thomson Tang
+ * @version Created: 30/06/2017.
+ */
+public interface MailSender {
+
+ String getSenderAddress();
+
+ String getSmtpHost();
+
+ void sendMail(List emails);
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/ProductService.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/ProductService.java
new file mode 100644
index 0000000000..da39ee967e
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/ProductService.java
@@ -0,0 +1,29 @@
+package com.thomsom.coderising.ood.srp.service;
+
+import com.thomsom.coderising.ood.srp.Product;
+
+import java.util.List;
+
+/**
+ * 商品业务逻辑接口
+ *
+ * @author Thomson Tang
+ * @version Created: 23/06/2017.
+ */
+public interface ProductService {
+ /**
+ * 查询所有的商品
+ *
+ * @return 商品列表
+ * @throws Exception if error
+ */
+ List listProduct() throws Exception;
+
+ /**
+ * 根据用户查询该用户关注的商品
+ *
+ * @param userId 用户标示符
+ * @return 用户关注的商品
+ */
+ List listSubscriptProduct(String userId);
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/UserService.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/UserService.java
new file mode 100644
index 0000000000..5e9716ae6d
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/UserService.java
@@ -0,0 +1,15 @@
+package com.thomsom.coderising.ood.srp.service;
+
+import com.thomsom.coderising.ood.srp.UserInfo;
+
+import java.util.List;
+
+/**
+ * the user service
+ *
+ * @author Thomson Tang
+ * @version Created: 29/06/2017.
+ */
+public interface UserService {
+ List listUser() throws Exception;
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/EmailServiceImpl.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/EmailServiceImpl.java
new file mode 100644
index 0000000000..4906b714e3
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/EmailServiceImpl.java
@@ -0,0 +1,53 @@
+package com.thomsom.coderising.ood.srp.service.impl;
+
+import com.thomsom.coderising.ood.srp.Email;
+import com.thomsom.coderising.ood.srp.Product;
+import com.thomsom.coderising.ood.srp.UserInfo;
+import com.thomsom.coderising.ood.srp.service.MailSender;
+import com.thomsom.coderising.ood.srp.service.EmailService;
+import com.thomsom.coderising.ood.srp.service.ProductService;
+import com.thomsom.coderising.ood.srp.service.UserService;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 邮件服务的实现类
+ *
+ * @author Thomson Tang
+ * @version Created: 29/06/2017.
+ */
+public class EmailServiceImpl implements EmailService {
+
+ private UserService userService;
+ private ProductService productService;
+ private MailSender mailSender;
+
+ @Override
+ public List createEmails() throws Exception {
+ List emailList = new ArrayList<>();
+ List userInfoList = userService.listUser();
+ userInfoList.forEach(userInfo -> {
+ Email email = new Email();
+ email.setToAddress(userInfo.getEmail());
+ email.setSubject("您关注的产品降价了...");
+ productService.listSubscriptProduct(userInfo.getUserId());
+ email.setContent(buildContent(userInfo));
+ emailList.add(email);
+ });
+
+ return emailList;
+ }
+
+ @Override
+ public void sendEmails(List emails) throws Exception {
+ mailSender.sendMail(emails);
+ }
+
+ private String buildContent(UserInfo userInfo) {
+ List products = productService.listSubscriptProduct(userInfo.getUserId());
+ StringBuilder allProduct = new StringBuilder();
+ products.stream().forEach(product -> allProduct.append(product).append(","));
+ return String.format("尊敬的%s,您关注的产品%s降价了,欢迎购买!", userInfo.getUserName(), allProduct.toString());
+ }
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/MailSenderImpl.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/MailSenderImpl.java
new file mode 100644
index 0000000000..741f4e2b08
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/MailSenderImpl.java
@@ -0,0 +1,35 @@
+package com.thomsom.coderising.ood.srp.service.impl;
+
+import com.coderising.ood.srp.Configuration;
+import com.coderising.ood.srp.ConfigurationKeys;
+import com.thomsom.coderising.ood.srp.Email;
+import com.thomsom.coderising.ood.srp.service.MailSender;
+
+import java.util.List;
+
+/**
+ * 发送邮件的实现类
+ *
+ * @author Thomson Tang
+ * @version Created: 01/07/2017.
+ */
+public class MailSenderImpl implements MailSender {
+
+ private Configuration configuration;
+
+ @Override
+ public String getSenderAddress() {
+ return configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ }
+
+ @Override
+ public String getSmtpHost() {
+ return configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+ }
+
+ @Override
+ public void sendMail(List emails) {
+ //模拟发送邮件
+ emails.forEach(email -> email.setFromAddress(getSenderAddress()));
+ }
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/ProductFileServiceImpl.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/ProductFileServiceImpl.java
new file mode 100644
index 0000000000..1434d92967
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/ProductFileServiceImpl.java
@@ -0,0 +1,55 @@
+package com.thomsom.coderising.ood.srp.service.impl;
+
+import com.thomsom.coderising.ood.srp.Product;
+import com.thomsom.coderising.ood.srp.service.ProductService;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+/**
+ * the implementation of product service which listing the products by reading from a file.
+ *
+ * @author Thomson Tang
+ * @version Created: 24/06/2017.
+ */
+public class ProductFileServiceImpl implements ProductService {
+ private String fileName;
+
+ public ProductFileServiceImpl(String fileName) {
+ this.fileName = fileName;
+ }
+
+ @Override
+ public List listProduct() throws Exception {
+ List products = new ArrayList<>();
+ Path path = Paths.get(getClass().getResource(fileName).toURI());
+ Stream lines = Files.lines(path);
+ lines.forEach(line -> products.add(resolveProduct(line)));
+ return products;
+ }
+
+ @Override
+ public List listSubscriptProduct(String userId) {
+ return null;
+ }
+
+ private Product resolveProduct(String line) {
+ String[] items = line.split(" ");
+ if (items.length > 2) {
+ return Product.newInstance(items[0], items[1]);
+ }
+ return Product.newInstance();
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/UserServiceImpl.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000000..56bcb3be6e
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/UserServiceImpl.java
@@ -0,0 +1,26 @@
+package com.thomsom.coderising.ood.srp.service.impl;
+
+import com.thomsom.coderising.ood.srp.UserInfo;
+import com.thomsom.coderising.ood.srp.service.UserService;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * the implementation of user service.
+ *
+ * @author Thomson Tang
+ * @version Created: 29/06/2017.
+ */
+public class UserServiceImpl implements UserService {
+
+ @Override
+ public List listUser() throws Exception {
+ List userInfos = new ArrayList<>();
+ for (int i = 0; i < 5; i++) {
+ UserInfo userInfo = new UserInfo(String.valueOf(i), "user" + i, String.format("user%d@qq.com", i));
+ userInfos.add(userInfo);
+ }
+ return userInfos;
+ }
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/resources/com/coderising/ood/srp/product_promotion.txt b/students/395135865/ood/ood-assignment/src/main/resources/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/resources/com/coderising/ood/srp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/402246209/learning/pom.xml b/students/402246209/learning/pom.xml
index 435c8fd478..8e4668829c 100644
--- a/students/402246209/learning/pom.xml
+++ b/students/402246209/learning/pom.xml
@@ -40,21 +40,17 @@
-
- org.apache.maven.plugins
- maven-jar-plugin
- 2.6
-
-
-
- com.mimieye.odd.srp.main.PromotionEmailMain
-
-
-
-
+
+
+
+ org.apache.commons
+ commons-lang3
+ 3.5
+
+
\ No newline at end of file
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Dice.java b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Dice.java
new file mode 100644
index 0000000000..c791c8f900
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Dice.java
@@ -0,0 +1,37 @@
+package com.mimieye.odd.uml.dice;
+
+/**
+ * Created by Pierreluo on 2017/6/27.
+ */
+public class Dice {
+ private int[] values;
+ private int currentValueIndex;
+ private int capacity;
+
+ public Dice(int capacity) {
+ this.capacity = capacity;
+ init();
+ }
+
+ private void init() {
+ this.values = new int[capacity];
+ int i = 0;
+ int judge = capacity - 1;
+ while(true) {
+ values[i] = i;
+ if(i == judge) {
+ break;
+ }
+ i++;
+ }
+ this.currentValueIndex = 0;
+ }
+
+ public int getCurrentValue() {
+ return values[currentValueIndex];
+ }
+
+ public void setCurrentValueIndex(int currentValueIndex) {
+ this.currentValueIndex = currentValueIndex;
+ }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/DiceGame.java b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/DiceGame.java
new file mode 100644
index 0000000000..439b5f7c7b
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/DiceGame.java
@@ -0,0 +1,25 @@
+package com.mimieye.odd.uml.dice;
+
+/**
+ * Created by Pierreluo on 2017/6/27.
+ */
+public class DiceGame {
+ private int winValue;
+
+ public DiceGame(int winValue) {
+ this.winValue = winValue;
+ }
+
+ public boolean result(Dice... dices) {
+ int resultValue = 0;
+ for(Dice dice : dices) {
+ resultValue += dice.getCurrentValue();
+ }
+ if(resultValue == winValue) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Player.java b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Player.java
new file mode 100644
index 0000000000..e6387788b6
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Player.java
@@ -0,0 +1,47 @@
+package com.mimieye.odd.uml.dice;
+
+import org.apache.commons.lang3.RandomUtils;
+
+/**
+ * Created by Pierreluo on 2017/6/27.
+ */
+public class Player {
+ private Dice[] dices;
+ private DiceGame diceGame;
+
+ public Player(int diceSize, int diceCapacity, int winValue) {
+ init(diceSize, diceCapacity, winValue);
+ }
+
+ private void init(int diceSize, int diceCapacity, int winValue) {
+ dices = new Dice[diceSize];
+ for(int i = 0; i < diceSize; i++) {
+ dices[i] = new Dice(diceCapacity);
+ }
+ diceGame = new DiceGame(winValue);
+ }
+
+ public boolean play() {
+ for(Dice dice : dices) {
+ dice.setCurrentValueIndex(RandomUtils.nextInt(0,6));
+ }
+ return diceGame.result(dices);
+ }
+
+ public static void main(String[] args) {
+ Player player = new Player(2, 6, 7);
+ System.out.println(player.play());
+ System.out.println(player.play());
+ System.out.println(player.play());
+ System.out.println(player.play());
+ System.out.println(player.play());
+ System.out.println(player.play());
+ System.out.println(player.play());
+ System.out.println(player.play());
+ System.out.println(player.play());
+ System.out.println(player.play());
+ System.out.println(player.play());
+ System.out.println(player.play());
+ }
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceClass.jpg b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceClass.jpg
new file mode 100644
index 0000000000..845c31c1ca
Binary files /dev/null and b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceClass.jpg differ
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceSequence.jpg b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceSequence.jpg
new file mode 100644
index 0000000000..168baadc21
Binary files /dev/null and b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceSequence.jpg differ
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/uml/shopping/shoppingUseCase.jpg b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/shopping/shoppingUseCase.jpg
new file mode 100644
index 0000000000..33e6ac55ae
Binary files /dev/null and b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/shopping/shoppingUseCase.jpg differ
diff --git a/students/729693763/1.ood/ood-assignment/pom.xml b/students/729693763/1.ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/729693763/1.ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+
+ com.coderising
+ ood-assignment
+ 0.0.1-SNAPSHOT
+ jar
+
+ ood-assignment
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+ aliyunmaven
+ http://maven.aliyun.com/nexus/content/groups/public/
+
+
+
diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+ static Map configurations = new HashMap<>();
+ static{
+ configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
+ }
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ * @param key
+ * @return
+ */
+ public String getProperty(String key) {
+
+ return configurations.get(key);
+ }
+
+}
diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp;
+
+public class ConfigurationKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ * @param sql
+ * @return
+ */
+ public static List query(String sql){
+
+ List userList = new ArrayList();
+ for (int i = 1; i <= 3; i++) {
+ HashMap userInfo = new HashMap();
+ userInfo.put("NAME", "User" + i);
+ userInfo.put("EMAIL", "aa@bb.com");
+ userList.add(userInfo);
+ }
+
+ return userList;
+ }
+}
diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..a02504fd05
--- /dev/null
+++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,64 @@
+
+package com.coderising.ood.srp;
+/**
+ * @author 作者 Denny
+ * @date 创建时间:Jun 25, 2017 10:27:58 AM
+ * @version 1.0
+ * @parameter
+ * @since
+ * @return */
+
+import java.util.List;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedList;
+
+public class FileUtil {
+
+ /**
+ * 根据文件路径获取文件,如果文件不存在,抛出异常
+ * @param fileName
+ * @return
+ * @throws FileNotFoundException
+ */
+ public static File readFile(String fileName) throws FileNotFoundException{
+ File file = new File(fileName);
+ if(!file.exists()){
+ throw new FileNotFoundException();
+ }
+ return file;
+ }
+
+ public static List parseToString(File file, String regex) {
+ List list = new ArrayList();
+ BufferedReader bf= null;
+ try {
+ if(file != null && file.exists( )){
+ bf = new BufferedReader(new FileReader(file));
+ String temp = null;
+ while ((temp = bf.readLine()) != null) {
+ String[] strs = temp.split(regex);
+ list.add(strs);
+ }
+ }
+ } catch (Exception e) {
+ // TODO: handle exception
+ e.printStackTrace();
+ }finally {
+ if(bf != null){
+ try {
+ bf.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ return list;
+ }
+
+}
diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..3c367759c4
--- /dev/null
+++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,48 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+
+ /**
+ * 邮件单元是需要管理邮件的,包括发送到哪,端口主机等等
+ */
+ private static String fromAddress = "";
+ private static String smtpHost = "";
+ private static String altSmtpHost = "";
+
+
+ private static Configuration config = new Configuration();
+
+ public static void ConfigureEmail() {
+ altSmtpHost = (String) config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+ fromAddress = (String) config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ smtpHost = (String) config.getProperty(ConfigurationKeys.SMTP_SERVER);
+
+ }
+
+
+ public static void sendEmail(String toAddress,String subject,String message) {
+ ConfigureEmail();
+ //假装发了一封邮件
+ try{
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(fromAddress).append("\n");
+ buffer.append("To:").append(toAddress).append("\n");
+ buffer.append("Subject:").append(subject).append("\n");
+ buffer.append("Content:").append(message).append("\n");
+ System.out.println(buffer.toString());
+ } catch (Exception e) {
+ try {
+ System.out.println("备用SMTP服务器: ");
+ MailUtil.sendEmail(toAddress, subject, message);
+
+ } catch (Exception e2) {
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+ }
+ }
+
+
+ }
+
+
+}
diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..902b6ff341
--- /dev/null
+++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,108 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class PromotionMail {
+
+ protected String subject = null;
+ protected String message = null;
+
+ private static List products = new ArrayList();
+
+ private static String filePath = "/Users/vi/Desktop/ood/ood-assignment/bin/src/main/java/com/coderising/ood/srp/product_promotion.txt";
+
+ private static ServerDAO server = new ServerDAO();
+
+ public static void main(String[] args) throws Exception {
+
+ File f = new File(filePath);
+ boolean emailDebug = false;
+
+ PromotionMail pe = new PromotionMail(f);
+ for (String[] data : products) {
+ List